我相信答案是 否定的 。并且我正在寻找一个 反例 来表明没有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输出中是连续的。
customerId
Row_number() 在每个customerId中是连续的。
Row_number()
我的理解是,如果没有明确的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