代码之家  ›  专栏  ›  技术社区  ›  Justin Ethier

相当于SQL Server top

  •  14
  • Justin Ethier  · 技术社区  · 15 年前

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

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

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

    9 回复  |  直到 15 年前
        1
  •  20
  •   Quassnoi    15 年前

    先选择 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 .

    选择行之间 一百 300 :

    MySQL :

    SELECT  *
    FROM    TABLE
    ORDER BY
            column
    LIMIT   100, 200
    

    波斯特雷斯尔 :

    SELECT  *
    FROM    Table
    ORDER BY
            column
    OFFSET 100 LIMIT 200
    

    甲骨文公司 :

    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 在外部查询中)不会返回 甲骨文公司 !

    RN BETWEEN 100 AND 200 将工作在 甲骨文公司 同样,但效率较低。

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

        2
  •  6
  •   Steve K    15 年前

    对于postgres和mysql,它是limit关键字。

    SELECT *
      FROM users
     ORDER BY id
     LIMIT 100;
    
        3
  •  3
  •   Otávio Décio    15 年前

    这是标准的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
  •  2
  •   Graeme Perrow    15 年前

    在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
  •  1
  •   Heiko Rupp    15 年前
    LIMIT 100
    

    如在

    SELECT * FROM foo ORDER BY bar LIMIT 100
    
        6
  •  1
  •   Pablo Santa Cruz    15 年前

    您可以在Oracle中使用rank()和close_rank()。 Here 是到asktom网站的链接,解释如何在Oracle中使用密集排名进行分页和顶级查询。

        7
  •  1
  •   Community M-A    7 年前

    神谕:

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

    对如何使它在 AskTom .

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

    select First 100 * from foo ORDER BY bar
    

    安格尔的问题已经在 StackOverflow 以前。

        8
  •  1
  •   Jovan Ross    15 年前

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

    从tbldata中选择* 只提取前10行 ;

        9
  •  0
  •   northpole    15 年前

    在Oracle中,您希望使用一个top-n查询。

    例如:

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

    这将获得前三个结果(因为我在子查询中按说明排序)