当前位置:  开发笔记 > 数据库 > 正文

带行计数器的SQLServer SQL查询

如何解决《带行计数器的SQLServerSQL查询》经验,为你挑选了2个好方法。

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

SELECT id, name FROM users where group = 2

我还需要包含一个具有递增整数值的列,因此第一行需要在计数器列中为1,第二行为2,第三行为3等

这里显示的查询只是一个简化的例子,实际上查询可能是任意复杂的,有几个连接和嵌套查询.

我知道这可以使用带有自动编号字段的临时表来实现,但有没有办法在查询本身中执行此操作?



1> LukeH..:

对于初学者来说,有些东西:

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如何决定优化查询.(有关详细信息,请参阅此文章.)

以保证结果的唯一途径总是在返回Row_Counter顺序完全相同的顺序适用于这两个SELECTROW_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还使查询的意图更清晰地给您的开发人员.



2> Cade Roux..:

在SQL Server 2005及更高版本中,您可以使用该ROW_NUMBER()函数,该函数具有排序顺序选项以及计数完成(和重置)的组.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有