小编典典

带行计数器的SQLServer SQL查询

sql

我有一个SQL查询,该查询返回一组行:

SELECT id, name FROM users where group = 2

我还需要包括一个具有递增整数值的列,因此第一行在计数器列中需要有一个1,第二行是2,第三行是3,依此类推

此处显示的查询只是一个简化的示例,实际上查询可能是任意复杂的,具有多个联接和嵌套查询。

我知道这可以通过使用带有自动编号字段的临时表来实现,但是在查询本身中是否可以做到这一点?


阅读 153

收藏
2021-04-15

共1个答案

小编典典

对于初学者,类似以下内容:

SELECT my_first_column, my_second_column,
    ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table

但是,请务必注意,该ROW_NUMBER() OVER (ORDER BY ...)构造仅确定的值Row_Counter,并不保证结果的顺序。

除非其SELECT本身具有显式ORDER BY子句,否则根据SQLServer决定优化查询的方式,可以按任何顺序返回结果。

确保 始终Row_Counter顺序返回结果的唯一方法是对SELECT和和都应用完全相同的顺序ROW_NUMBER()

SELECT my_first_column, my_second_column,
    ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table
ORDER BY my_order_column  -- exact copy of the ordering used for Row_Counter

上面的模式将始终以正确的顺序返回结果,并且适用于简单查询,但是ORDER BY子句中可能包含数十个表达式的“任意复杂”查询又如何呢?在这种情况下,我更喜欢这样的事情:

SELECT t.*
FROM
(
    SELECT my_first_column, my_second_column,
        ROW_NUMBER() OVER (ORDER BY ...) AS Row_Counter  -- complex ordering
    FROM my_table
) AS t
ORDER BY t.Row_Counter

使用嵌套查询意味着不需要重复复杂的ORDER BY子句,这意味着更少的混乱情况和更容易的维护。外层ORDER BY t.Row_Counter也使您的开发人员更加清楚查询的意图。

2021-04-15