2016-02-17 53 views
0

我有一個查詢如下...更改選擇列表中的影響記錄選定

select * 
from (select COL1, COL2, COL3, 
        ROW_NUMBER() OVER (PARTITION BY COL2,COL3 ORDER BY COL2,COL3) AS rn 
    from TABLE 
    ) t 
where rn = 1 

它返回預期結果。當我修改外選擇明確要求列沒有行號列從而...

select COL1, COL2, COL3 from 
from (select COL1, COL2, COL3, 
      ROW_NUMBER() OVER (PARTITION BY COL2, COL3 ORDER BY COL2, COL3) AS rn from TABLE 
    ) t 
where rn = 1 

我得到不同的結果。事實上,返回的COL1,COL2和COL3列中的值的組合實際上不存在於數據庫中的任何行中。

我是否瘋了,發現了一個錯誤或更可能,我誤解這應該如何工作?

回答

1

您還沒有在partition byorder by中包含col1。所以,我的猜測是,您有多行,其中col2col3具有相同的值(以及col1中的不同值)。

在SQL中,排序不穩定 - 也就是說,具有相同鍵的行可以按任意順序出現。當您運行相同的查詢兩次時,情況更是如此。而且,這就是你所見證的;只是這種排序不穩定。

不穩定的排序使完美在SQL中的意義。表格代表無序集合,因此當鍵具有相同的值時,沒有「自然」排序。

如果您想要穩定的排序,請在order by中包含一個額外的列;例如,如果您包含col1,那麼每次運行查詢時都會得到相同的結果。

+0

非常感謝。你的回答不僅解釋了我所看到的,而且還幫助我認識到,我認爲沒有任何迴歸的行確實存在就是謊言。 – Glen

+0

我明白你的意思。所以分區由col2,col3命令應該是col1對嗎?我只是自己嘗試過,無論我嘗試過多少次,都發現它只是由col1訂購。數據庫中是否有默認的訂單? –

+0

@ Raffaello.D.Huke。 。 。有些情況下SQL Server可能會按特定的順序處理事物(例如,如果'col1','col2'和'col3'在索引中)。但是沒有保證。 –