我可以依靠输出的顺序使用ROW_NUMBER时()(Can I depend on order of

2019-06-25 14:29发布

我认为答案是否定的。 而要寻找一个反例表明,输出的顺序是没有保证的,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中,输出顺序有两个属性:

  1. 对于每一行customerId是输出连续的。

  2. Row_number()是每个客户ID内顺序进行的。

我的理解是,这两个属性,不保证by子句没有一个明确的顺序。 我想找一份上述属性并不认为不被强迫命令的条款,但仅仅是MS SQL Server如何发生的工作结果的一个例子。 随意,如果需要开发自己的表定义,索引等在你的榜样。

或者,如果我错了,这将表明,这些排序保证,即使没有条款明确顺序的参考的链接。

Answer 1:

如果你想要一个有序的结果集,BY子句添加命令,你的选择 。 期。 还有什么是间接且可能会或可能无法正常工作取决于你正在测试的当前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


Answer 2:

林奋力发现这里的相关性; 如果你想明确的排序推荐的方法是在查询中使用ORDER BY子句。

生产的查询,我的结果的顺序依赖的时候我绝不会依赖于表的默认排序。 任何现代RDBMS将是能够通过基于指数等以优化订单,所以它不是东西,有可担心的。

在关于ROW_NUMBER,而这是一个副作用,如果没有ORDER BY子句存在,则输出由ROW_NUMBER值排序,你不能依赖这种行为,因为它不能保证。

同样,为了保证输出的顺序的唯一方法是使用ORDER BY子句。



Answer 3:

如前所述,你不能没有一个ORDER BY依靠行顺序。

但是,你可以依靠ROW_NUMBER()函数

SELECT
    principal_id, name, 
    ROW_NUMBER() OVER (ORDER BY principal_id DESC) AS DemoRank
FROM
    msdb.sys.database_principals
ORDER BY
    name

如果你消耗你的客户通过DemoRank数据,那么你将是美好的,即使没有ORDER BY子句

如果依靠记录顺序(顺序索引),则没有。

上面的例子中给出了第一行(索引= 0)为“ ##MS_PolicyEventProcessingLogin## ”,但是使用DemoRank值给出“db_denydatawriter”

基本上,使用ORDER BY。



Answer 4:

如果你想它下令,必须使用ORDER BY。

只看与执行计划

SET SHOWPLAN_ALL ON

如果没有“ORDER BY”在StmtText列,你只要把事情但是,所有这些工作完成后,他们进行排序。 有时候,你很幸运,有时不用,用的数据是如何存储/加载/过滤/加盟等,它是如何返回。



文章来源: Can I depend on order of output when using row_number()