题
在 SQL Server 中,TOP 可用于返回查询中的前 n 行。例如,
SELECT TOP 100 * FROM users ORDER BY id可能用于返回注册某个网站的前 100 个人。(这不一定是最好的方法,我只是用它作为例子)。
我的问题是 - 其他数据库(例如 Oracle、MySQL、PostgreSQL 等)中 TOP 的等效项是什么?如果没有等效的关键字,您可以推荐哪些解决方法来达到相同的结果?
解决方案
首先要选择 100
行:
MySQL
和 PostgreSQL
:
SELECT *
FROM Table
ORDER BY
column
LIMIT 100
Oracle
:
SELECT *
FROM (
SELECT t.*
FROM table
ORDER BY
column
)
WHERE rownum <= 100
请注意,这里需要一个子查询。如果不添加子查询, ROWNUM
将首先选择 10
按随机顺序排列行,然后对它们进行排序 column
.
选择之间的行 100
和 300
:
MySQL
:
SELECT *
FROM TABLE
ORDER BY
column
LIMIT 100, 200
PostgreSQL
:
SELECT *
FROM Table
ORDER BY
column
OFFSET 100 LIMIT 200
Oracle
:
SELECT *
FROM (
SELECT t.*, ROW_NUMBER() OVER (ORER BY column) AS rn
FROM table
)
WHERE rn >= 100
AND rownum <= 200
请注意,尝试将其简化为 ROWNUM BETWEEN 100 AND 200
(相对于 rn BETWEEN 100 AND 200
在外部查询中)将不返回任何内容 Oracle
!
RN BETWEEN 100 AND 200
将在 Oracle
也一样,但效率较低。
有关性能详细信息,请参阅我的博客中的文章:
其他提示
对于Postgres和MySQL,它是LIMIT关键字。
SELECT *
FROM users
ORDER BY id
LIMIT 100;
这是标准SQL(Oracle和SQL Server实现它)。这是一个最多返回100行的示例:
SELECT ID_CONTROL FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID_CONTROL)
ROWNUMBER, ID_CONTROL FROM IWS_CONTROL WHERE
CURRENT_STATE = 15 AND CURRENT_STATUS=0) A WHERE ROWNUMBER <= 100)
在SQL Anywhere中,它与SQL Server相同:
SELECT TOP 100 * FROM users ORDER BY id
如果需要,您甚至可以在结果集的中间开始:
SELECT TOP 100 START AT 50 * FROM users ORDER BY id
获取结果集的第50行到第150行。
LIMIT 100
,如
SELECT * FROM foo ORDER BY bar LIMIT 100
您可以在Oracle中使用RANK()和DENSE_RANK()。 此处是AskTom网站的链接,说明如何使用Oracle中的DENSE_RANK进行分页和前n个查询。
甲骨文:
select * from (select * from foo ORDER BY bar) where rownum < 100
有关如何使其在中运行的一个很好的解释AskTom 。
在Ingres中,相同的查询将通过:
select First 100 * from foo ORDER BY bar
Ingres问题已在 StackOverflow中得到解答之前。
在DB2中,您可以使查询看起来像这样:
SELECT * FROM tblData FETCH仅限10行;
在Oracle中,您希望使用TOP-N查询。
例如:
select *
from (SELECT *
FROM foo
where foo_id=[number]
order by foo_id desc)
where rownum <= 3
这将获得前三个结果(因为我在子查询中通过desc命令)