【问题标题】:SQL Select query that returns a range [duplicate]返回范围的SQL Select查询[重复]
【发布时间】:2011-07-28 09:41:45
【问题描述】:

可能重复:
Row Offset in MS SQL Server

我想选择从 x1 到 x2 的范围。就像您可以选择排名靠前的结果一样:

SELECT TOP X * FROM TABLE

SELECT TOP 5 * FROM tUsers

但我想选择中间结果。那么如果我想要结果 10-20 有没有办法查询呢?

SELECT 10-20 * FROM TABLE?

【问题讨论】:

标签: sql sql-server


【解决方案1】:

在 mysql 中这是

SELECT * FROM table LIMIT 10,20

【讨论】:

    【解决方案2】:

    使用 SQL Server:

    Row Offset in SQL Server

    使用 MySQL:

    SELECT * FROM `your_table` LIMIT 10, 20
    

    使用甲骨文:

    SELECT * FROM `your_table` WHERE rownum >= 10 and rownum < 20;
    

    使用 PostgreSQL :

    SELECT * FROM `your_table` LIMIT 20 OFFSET 10
    

    `your_table` 必须替换为你的真实表名

    【讨论】:

    • 反引号在 Oracle 和 PostgreSQL 中是非法的(实际上在除 MySQL 之外的任何数据库中) - 即使对于 MySQL 示例,它们也是绝对不必要的
    • `your_table` 必须替换为真实的表名...
    • @a_horse_with_no_name `your_table` 必须换成真实的表名!!!
    • 还有一件事,Oracle 8 到 9i 中的一个常见错误是像那样使用 RowNum(不知道它们是否在最近的版本中发生了变化)。 Romnum 是数据库计算的最后一件事,这意味着如果您使用 Rownum > 1,它将始终不返回任何行(因为没有行会填满第一个位置,所以没有其他行的 rownum > 1。
    • 为了对上述问题有所指导,您必须在内部选择中选择 rowNums(因此它们将被计算并作为常规数据返回到最外面的选择),然后,在外部选择上,像这样使用它(rownum >= 10)。同样,我只在版本 8、8i 和 9i 上确定这一点。
    【解决方案3】:

    在 SQL Server 2005 或更高版本中,您可以使用 CTEROW_NUMBER 函数:

    WITH TblCte as
    (
    SELECT  *
            ,ROW_NUMBER() OVER (ORDER BY OrderCol) RowNumber
    FROM    Table
    )
    SELECT  *
    FROM    TblCte
    WHERE   RowNumber between 10 and 20
    

    在 SQL Server 2000 或更低版本中,这是相当困难和低效的: http://social.msdn.microsoft.com/Forums/en-IE/transactsql/thread/e92d9b03-42ad-4ab9-9211-54215e7b9352

    【讨论】:

      【解决方案4】:

      您使用的是什么数据库?如果您使用的是 Oracle,请尝试

      where rownum >= 10 and rownum < 20;
      

      【讨论】:

      • 那行不通 - 必须使用派生表评估 rownum:select * from (select col_!, rownum as rn from your_table) where rn >= 10 and rn
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多