可以将行号添加到不依赖于顺序的 SELECT 子句
Posted
技术标签:
【中文标题】可以将行号添加到不依赖于顺序的 SELECT 子句【英文标题】:possible to add a row number to a SELECT clause that is not order dependent 【发布时间】:2012-06-17 15:44:42 【问题描述】:如果我有这个fiddle
CREATE TABLE temp
(
y char(9),
x char(9)
);
insert into temp (x, y) values ('j', 'hello');
insert into temp (x, y) values ('j', 'world');
insert into temp (x, y) values ('q', 'foo');
insert into temp (x, y) values ('q', 'bar');
select
x
,y
from temp
我想在 SELECT 子句中包含一个行号。所以结果应该是这样的:
x y r
j hello 1
j world 2
q foo 3
q bar 4
我不相信 Row_number() over 会起作用,因为这需要一个订单,我不想从SELECT * FROM
更改订单。也不想在客户端数据库表中添加一个标识列
这在 SQL-Server 中可行吗?
【问题讨论】:
每次运行查询时r
值不一定匹配到同一行,您是否同意?为什么不关心订单?这些结果以什么顺序返回给客户端真的无关紧要吗?为什么不让客户端应用一个行号,因为无论如何它都必须循环显示它们,而且大多数客户端语言都非常有能力维护一个计数器。
【参考方案1】:
如果您对 r
的不确定性感到满意(换句话说,它可能不会每次都以相同的方式工作):
select
x
,y
, r = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
from temp
order by r;
即使是一个非常简单的情况,它也不能以同样的方式工作:
CREATE TABLE temp
(
y char(9) PRIMARY KEY,
x char(9)
);
当然,如果您希望顺序是随机的:
select
x
,y
, r = ROW_NUMBER() OVER (ORDER BY NEWID())
from temp
order by r;
【讨论】:
SQL Server 不允许row_number() over ()
(由 SQL 标准定义)吗?
@a_horse_with_no_name no, Msg 4112, Level 15, State 1, Line 2 The function 'ROW_NUMBER' must have an OVER clause with ORDER BY.
这仍然是 SQL Server 2012 中的功能差距(尽管他们对窗口功能进行了许多其他增强)。
就像在你的第一个脚本中使用 NULL + 我以前没有遇到过 NEWID() - 谢谢
@AaronBertrand:感谢您的反馈。我不知道 SQL Server 的窗口功能仍然有限。
太棒了,解决了我的问题以上是关于可以将行号添加到不依赖于顺序的 SELECT 子句的主要内容,如果未能解决你的问题,请参考以下文章