我相信答案是否 .我正在寻找一个 反例 表明不保证输出顺序,没有 order by 子句。
考虑:
create table #order (orderId int primary key clustered
, customerId int not null -- references customer(customerId)
, orderDateTIme datetime not null)
insert into #order values (1, 100, '2009-01-01')
insert into #order values (2, 101, '2009-01-02')
insert into #order values (3, 102, '2009-01-03')
insert into #order values (4, 103, '2009-01-04')
insert into #order values (5, 100, '2009-01-05')
insert into #order values (6, 101, '2009-01-06')
insert into #order values (7, 101, '2009-01-07')
insert into #order values (8, 103, '2009-01-08')
insert into #order values (9, 105, '2009-01-09')
insert into #order values (10, 100, '2009-01-10')
insert into #order values (11, 101, '2009-01-11')
insert into #order values (12, 102, '2009-01-12')
insert into #order values (13, 103, '2009-01-13')
insert into #order values (14, 100, '2009-01-14')
insert into #order values (15, 100, '2009-01-15')
insert into #order values (16, 101, '2009-01-16')
insert into #order values (17, 102, '2009-01-17')
insert into #order values (18, 101, '2009-01-18')
insert into #order values (19, 100, '2009-01-19')
insert into #order values (20, 101, '2009-01-20')
select * from #order
-- Results in PK order due to clustered primary key
select orderId, CustomerId, orderDateTime
, row_number() over (partition by customerId order by orderDateTime) RN
from #order
在 MS SQL Server 2005 上,输出顺序有两个属性:
customerId
的行是在输出中连续。
Row_number()
是连续的每个客户 ID。
我的理解是,如果没有明确的 order by 子句,则不能保证这两个属性。我正在寻找一个示例,其中上述属性不成立,该属性不是由 order by 子句强制的,而只是 MS SQL Server 工作方式的结果。如果需要,可以在示例中随意开发自己的表定义、索引等。
或者,如果我错了,即使没有明确的 order by 子句,也可以提供一个指向引用的链接,该链接将表明这些排序是有保证的。
最佳答案
如果你想要一个有序的结果集,将 ORDER BY 子句添加到您的 SELECT .时期。其他任何事情都是间接的,可能会或可能不会起作用,这取决于您正在测试的当前 SQL 构建、优化器当天的心情以及火星在双鱼座的相位。
一个与您的假设相矛盾的小例子:
select orderId, CustomerId, orderDateTime
, row_number() over (partition by customerId order by orderDateTime) RN
, row_number() over (partition by orderDateTime order by customerId) AntiRN
from #order
关于sql - 使用 row_number() 时是否可以依赖输出顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110643/