可以将行号添加到不依赖于顺序的 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 子句的主要内容,如果未能解决你的问题,请参考以下文章

带有 order by 子句的 SQL 查询

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

PostgreSQL 行排序详解

SQL语句执行顺序

mysql执行顺序

OracleSQL 中Select语句完整的执行顺序