在 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 进行分页和 top-n 查询。
甲骨文:
select * from (select * from foo ORDER BY bar) where rownum < 100
关于如何在AskTom中工作的很好的解释。
在 Ingres 中,相同的查询将通过:
select First 100 * from foo ORDER BY bar
之前在StackOverflow中已经回答了 Ingres 问题。
在 DB2 中,您可以使查询看起来像这样:
SELECT * FROM tblData仅获取前 10行;
在 Oracle 中,您想使用 TOP-N 查询。
例如:
select *
from (SELECT *
FROM foo
where foo_id=[number]
order by foo_id desc)
where rownum <= 3
这将为您提供前三个结果(因为我在子查询中按 desc 排序)