我有一个SQL查询,该查询返回一组行:
SELECT id, name FROM users where group = 2
我还需要包括一个具有递增整数值的列,因此第一行在计数器列中需要有一个1,第二行是2,第三行是3,依此类推
此处显示的查询只是一个简化的示例,实际上查询可能是任意复杂的,具有多个联接和嵌套查询。
我知道这可以通过使用带有自动编号字段的临时表来实现,但是在查询本身中是否可以做到这一点?
对于初学者,类似以下内容:
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,并不保证结果的顺序。
ROW_NUMBER() OVER (ORDER BY ...)
Row_Counter
除非其SELECT本身具有显式ORDER BY子句,否则根据SQLServer决定优化查询的方式,可以按任何顺序返回结果。
SELECT
ORDER BY
确保 始终 按Row_Counter顺序返回结果的唯一方法是对SELECT和和都应用完全相同的顺序ROW_NUMBER():
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也使您的开发人员更加清楚查询的意图。
ORDER BY t.Row_Counter