2009-07-10 47 views
3

我相信答案是没有。并且我正在寻找计数器示例以显示输出的顺序不能保证,缺少按顺序的子句。我可以依靠输出的顺序使用ROW_NUMBER()时

考虑:

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()在每个customerId的 内是连续的。

我的理解是,这两个属性不保证没有明确的条款顺序。我正在寻找一个例子,其中上述属性不保留,这不是由order by子句强制的,而仅仅是MS SQL Server恰好工作的结果。如果需要,随意在你的例子中开发自己的表定义,索引等。

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

+2

+1为脚本创建您的示例,我希望每个人都这样做! – 2009-07-10 18:14:54

回答

10

如果你想要一个有序的结果集,BY子句添加命令,你的SELECT。期。除此之外,其他任何事情都是间接的,可能会或可能不会工作,具体取决于您正在测试的当前SQL构建,优化器的当天情绪以及Mars在双鱼座的过境阶段。

违背你的假设一个简单的例子:

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 
+1

我的假设是,“这两个属性不能保证没有明确的条款顺序”所以,你不是假设我的假设,但你确实提供了我正在寻找的一个例子。 – 2009-07-10 17:42:32

2

我在这里努力寻找相关性;如果你想显式的排序,推荐的方法是在查询中使用ORDER BY子句。

我会从来没有依赖于表的默认排序时产生一个查询,我依靠结果的顺序。任何现代的关系型数据库管理系统都将能够基于索引等来优化订单,所以它不是必须担心的事情。

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

同样,只有保证输出顺序的方法是使用ORDER BY子句。

+0

相关性是,我希望与其他依赖row_number()over(order by)执行排序的程序员一起工作,而不是按顺序by子句调用它。 – 2009-07-10 17:56:27

0

如果你想要订购,则必须使用ORDER BY。

只是看执行计划与

SET SHOWPLAN_ALL ON 

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

1

如前所述,您不能依赖没有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。

相关问题