【问题标题】:Equivalents to SQL Server TOP等效于 SQL Server TOP
【发布时间】:2009-05-06 13:37:09
【问题描述】:

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

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

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

【问题讨论】:

标签: sql database keyword


【解决方案1】:

选择第一个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 中工作,但效率较低。

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

【讨论】:

  • 为什么不标准化? @ocdecia 发布的内容根本不清楚,我认为 mysql 和 postgre 符号是最好的
  • @Pablote:因为 Oracle 比我老,而 Sybase(SQL Server 的基础)只年轻 4 岁。那个时候没有标准。到标准出现时,已经存在太多代码来改变任何东西。
  • @Pablote:@ocdecio 发布的是分析函数,而不是记录集限制。它们可用于限制记录集,但这不是它们的主要目标。
  • @Quassnoi - 没错,但它属于 SQL3 标准窗口函数,因此 IMO 比使用每个供应商的特定语法更好。
  • @ocdecio:ROW_NUMBER 在 Oracle 中的效率始终低于 ROWNUM,在 MS SQL 中有时也低于 TOP。
【解决方案2】:

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

SELECT *
  FROM users
 ORDER BY id
 LIMIT 100;

【讨论】:

    【解决方案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)
    

    【讨论】:

      【解决方案4】:

      在 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 行。

      【讨论】:

        【解决方案5】:
        LIMIT 100
        

        SELECT * FROM foo ORDER BY bar LIMIT 100
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            甲骨文:

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

            AskTom 中很好地解释了如何使它工作。

            在 Ingres 中,相同的查询会:

            select First 100 * from foo ORDER BY bar
            

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

            【讨论】:

            • 所以,查询实际上应该是:select * from (select * from foo order by bar) where rownum
            • 糟糕,应该是
            【解决方案8】:

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

            SELECT * FROM tblData 仅获取前 10 行;

            【讨论】:

              【解决方案9】:

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

              例如:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-05-01
                • 2013-10-07
                • 2018-11-20
                • 2014-05-30
                • 1970-01-01
                • 1970-01-01
                • 2011-09-04
                • 2021-10-26
                相关资源
                最近更新 更多