相当于SQL Server TOP

时间:2009-05-06 13:37:09

标签: sql database keyword

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

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

我的问题是 - 在Oracle,MySQL,PostgreSQL等其他数据库中,TOP的等价物是什么?如果没有等效的关键字,您可以推荐哪些变通方法来实现相同的结果?

9 个答案:

答案 0 :(得分: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对其进行排序。

选择100300之间的行:

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命令)