加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer SQL查询带有一个行计数器

发布时间:2020-12-12 07:06:25 所属栏目:MsSql教程 来源:网络整理
导读:我有一个SQL查询,它返回一组行: SELECT id,name FROM users where group = 2 我还需要包含一个具有递增整数值的列,所以第一行需要在计数器列中有一个,第二行为2,第三个为3等。 这里显示的查询只是一个简化的例子,实际上查询可能是任意复杂的,有几个连
我有一个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也使得查询的意图更加清楚您的开发人员。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读