【问题标题】:SQL select single row number x onlySQL 仅选择单行号 x
【发布时间】:2021-02-16 05:55:24
【问题描述】:

为了在 VBA 中处理 SQL 数据,我想使用一个循环 (For...Next) 从 SQL 数据库中逐行读取。由于记录被删除,ID 列有间隙。例如,该表如下所示:

ID   Value
1    Peter
3    Paul
4    Mary
9    George

有四行我想运行

For i = 1 to 4
   SELECT ???
Next i

当然,“For each”也可以。

【问题讨论】:

    标签: sql sql-server vba sql-order-by sql-limit


    【解决方案1】:

    如果你想逐行阅读,你可以遍历结果集。但是如果真的需要枚举值,可以使用row_number()

    select row_number() over (order by id) as seqnum, t.*
    from t;
    

    seqnum 然后保证是一个从 1 开始的没有间隙的递增值。

    编辑:

    如果您想选择特定行,可以row_number() 与子查询或 CTE 结合使用:

    select t.*
    from (select row_number() over (order by id) as seqnum, t.*
          from t
         ) t
    where seqnum = 10;
    

    但推荐的方法是offset/fetch:

    select t.*
    from t
    order by id 
    offset 9 row fetch first 1 row only;
    

    【讨论】:

    • 谢谢。但是我不能添加所需的 WHERE 。 select row_number() over (order by id) as seqnum, t.* from t WHERE seqnum = 10 失败
    • row_number 在读取所有行并在应用程序中处理它们时非常有用。谢谢
    【解决方案2】:

    如果您想要 4 行,则使用 order bytop - 或 fetch clause

    select top(4) t.*
    from mytable t
    order by id
    

    或者:

    select t.*
    from mytable t
    order by id
    offset 0 rows fetch first 4 rows only
    

    然后您可以遍历应用程序中的结果集。

    另一方面,如果您只想要第 4 行,那么只需更改 fetch 子句:

    select t.*
    from mytable t
    order by id
    offset 3 rows fetch next 1 row only
    

    【讨论】:

    • 那一行“偏移 3 行仅获取下 1 行”正是我想要的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2010-11-02
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多