在SQL Server中,TOP可用于返回查询中的前n行。例如,
SELECT TOP 100 * FROM users ORDER BY id可能用于返回为网站注册的前100个人。 (这不一定是最好的方式,我只是以它为例)。
我的问题是 - 在Oracle,MySQL,PostgreSQL等其他数据库中,TOP的等价物是什么?如果没有等效的关键字,您可以推荐哪些变通方法来实现相同的结果?
答案 0 :(得分:20)
选择第一个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
中使用,但效率较低。
请参阅我博客中的文章了解效果详情:
答案 1 :(得分:6)
对于Postgres和MySQL,它是LIMIT关键字。
SELECT *
FROM users
ORDER BY id
LIMIT 100;
答案 2 :(得分:3)
这是标准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)
答案 3 :(得分:2)
在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行。
答案 4 :(得分:1)
LIMIT 100
,如
SELECT * FROM foo ORDER BY bar LIMIT 100
答案 5 :(得分:1)
您可以在Oracle中使用RANK()和DENSE_RANK()。 Here是AskTom网站的链接,解释了如何使用Oracle中的DENSE_RANK进行分页和前n个查询。
答案 6 :(得分:1)
甲骨文:
select * from (select * from foo ORDER BY bar) where rownum < 100
有关如何使其在AskTom中有效的详细解释。
在Ingres中,相同的查询将通过:
select First 100 * from foo ORDER BY bar
Ingres问题之前已在StackOverflow中得到解答。
答案 7 :(得分:1)
在DB2中,您可以使查询看起来像这样:
SELECT * FROM tblData FETCH仅限10行;
答案 8 :(得分:0)
在Oracle中,您希望使用TOP-N查询。
例如:
select *
from (SELECT *
FROM foo
where foo_id=[number]
order by foo_id desc)
where rownum <= 3
这将获得前三个结果(因为我在子查询中通过desc命令)