【问题标题】:Can you select the Nth row in the dataset returned by SELECT statement?您可以选择SELECT语句返回的数据集中的第N行吗?
【发布时间】:2012-06-06 02:22:16
【问题描述】:

在伪代码中,我的意思是,你能做这样的事情吗(类似于 TOP):

SELECT Row 2
*
FROM Table
WHERE Column1 = Condition

我想为测试做点什么——我想不出现实世界的场景。只是好奇是否可能。我在 Interwebz 上找不到任何关于它的信息。

【问题讨论】:

  • 现实世界的场景称为“分页”。
  • 你会得到很多关于如何执行分页的答案,有些在前几页会表现良好,但随着你“分页”向下而迅速恶化。请阅读sqlservercentral.com/articles/T-SQL/66030 和后续cmets sqlservercentral.com/Forums/Topic672980-329-1.aspx
  • @AaronBertrand:“随机访问”分页有更好的解决方案吗?
  • @AaronBertrand 谁说这与分页有关?我经常必须对除日期戳之外相同的行执行此操作,并且需要获取特定行,即第 3 天或第 4 天等
  • @AaronBertrand 不管你说什么,伙计。我得到了我想要的东西。随心所欲地使用和滥用 cmets。尽量降低噪音,以免邻居抱怨。

标签: sql sql-server-2005 select


【解决方案1】:

这会给你第 9 行:

select top 1 *
from (
    select top 9 *
    from MyTable
    order by 1) as x
order by 1 desc

【讨论】:

  • 这是更好的解决方案,因为它适用于不支持行号的数据库
  • @Yatrix 是的。同意。所以现在是谷歌的顶级链接。如果有人正在寻找类似的问题,但在不支持 rownum 的数据库中,这将派上用场:-)
  • @ejb_guy:对于那些仍然坚持SQL Server 2000 的可怜人来说,这是一个很好的解决方案,但它必须排序两次。不知道为什么有人想在2005 及以上使用它。
  • @AaronBertrand:查询将按任意顺序返回一条记录。但是,如果查询中有 rn BETWEEN,并且您将 ORDER BY 附加到末尾,这将是一个空操作:SQL Server 不会再次对结果集进行排序,因为它已经排序(或取出索引的)由OVER 子句中的ORDER BY
  • @AaronBertrand: 优化器无法保证任何事情,但在当前实现中,CTE 返回的结果集将被标记为已排序(ROW_NUMBER() 甚至无法并行化),因此下一个 relops 将再次未排序。此外,SQL Server 优化了ROW_NUMBER() < @n 以使用TOP。如果所需的顺序与OVER 的顺序不同(假设您需要按姓氏排序的 TOP 10 用户),那么它当然必须排序两次(并且作者的查询必须添加另一个 ORDER BY并排序三次)
【解决方案2】:
SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY col2) rn
        FROM    mytable
        WHERE   col1 = condition
        ) q
WHERE   rn = 4

【讨论】:

    【解决方案3】:
    WITH QUERY AS (
                   SELECT *, ROW_NUMBER() OVER(ORDER BY Column1) AS RowNumber
                   FROM Table
                   )
    SELECT * FROM QUERY WHERE ROWNUMBER = N
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2021-06-23
      • 2020-08-28
      • 2013-12-28
      相关资源
      最近更新 更多