我有一个SQL查询,它返回一组行:
- SELECT id,name FROM users where group = 2
我还需要包含一个具有递增整数值的列,所以第一行需要在计数器列中有一个,第二行为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的值,但不能保证结果的顺序。
除非SELECT本身具有明确的ORDER BY子句,否则可以按任何顺序返回结果,这取决于sql Server如何决定优化查询。 (See this article for more info.)
确保结果总是以Row_Counter顺序返回的唯一方法是对SELECT和ROW_NUMBER()应用完全相同的顺序:
- SELECT my_first_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,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也使得查询的意图更加清楚您的开发人员。