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

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

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

有帮助吗?

解决方案

首先要选择 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 也一样,但效率较低。

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

其他提示

对于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进行分页和前n个查询。

甲骨文:

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

有关如何使其在中运行的一个很好的解释AskTom

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

select First 100 * from foo ORDER BY bar

Ingres问题已在 StackOverflow中得到解答之前。

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

SELECT * FROM tblData FETCH仅限10行;

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

例如:

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

这将获得前三个结果(因为我在子查询中通过desc命令)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top