2009-07-10 50 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。

相關問題