15

在 SQL Server 中,TOP 可用于返回查询中的前 n 行。例如,

SELECT TOP 100 * FROM users ORDER BY id
可用于返回注册网站的前 100 人。(这不一定是最好的方法,我只是以它为例)。

我的问题是 - 在其他数据库(如 Oracle、MySQL、PostgreSQL 等)中,什么相当于 TOP?如果没有等效的关键字,您可以推荐哪些解决方法来获得相同的结果?

4

9 回答 9

20

要选择第一100行:

MySQLPostgreSQL

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但效率较低。

有关性能详细信息,请参阅我博客中的文章:

于 2009-05-06T13:44:15.190 回答
6

对于 Postgres 和 MySQL,它是 LIMIT 关键字。

SELECT *
  FROM users
 ORDER BY id
 LIMIT 100;
于 2009-05-06T13:40:28.070 回答
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)
于 2009-05-06T13:44:17.810 回答
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 行。

于 2009-05-07T14:33:02.350 回答
1
LIMIT 100

如在

SELECT * FROM foo ORDER BY bar LIMIT 100
于 2009-05-06T13:39:47.603 回答
1

您可以在 Oracle 中使用 RANK() 和 DENSE_RANK()。是 AskTom 网站的链接,解释了如何在 Oracle 中使用 DENSE_RANK 进行分页和 top-n 查询。

于 2009-05-06T13:40:34.577 回答
1

甲骨文:

select * from (select * from foo ORDER BY bar) where rownum < 100

关于如何在AskTom中工作的很好的解释。

在 Ingres 中,相同的查询将通过:

select First 100 * from foo ORDER BY bar

之前在StackOverflow中已经回答了 Ingres 问题。

于 2009-05-06T13:40:34.933 回答
1

在 DB2 中,您可以使查询看起来像这样:

SELECT * FROM tblData仅获取前 10行;

于 2009-05-06T15:14:17.953 回答
0

在 Oracle 中,您想使用 TOP-N 查询。

例如:

select  *
  from  (SELECT  *
           FROM  foo
          where  foo_id=[number]
       order by  foo_id desc)
 where  rownum <= 3

这将为您提供前三个结果(因为我在子查询中按 desc 排序)

于 2009-05-06T13:58:41.223 回答