2012-09-13 74 views
2

(一「工作原理」 - 問題)sql服務器是否介意插入記錄的方式?

假設我有這個表:

Id   val 
    ------------------ 
    1    a  <-- 
    1    a 
    1    a 
    2    b  <-- 
    2    b 
    2    b 

現在可以說,我想標記的行:

我能指望這個查詢:

select id,val from (
select id , val , row_number() over (partition by id order by id) as rn 
) k where rn=1 

給我選擇行?

(請注意order by條款)。它會將訂單視爲它們所插入的訂單嗎?

+1

請問這個問題從[這個問題](HTTP來在你的心中:// stackoverflow.com/questions/12402170/getting-one-row-sql)? – hims056

+1

@ hims056的確如此。我也在那裏回答。但somoenes評論引起了我的注意。 –

+0

不,並且查詢計劃甚至可能包含一個「ANY(val)」聚合,表示可以選擇每個「Id」的任何行。詳情請見http://bit.ly/AnyAggregate –

回答

2

該行爲不能保證。您的查詢將返回兩行,但哪些未定義。

當我實驗

create table #t (id int, val char(1), t timestamp) 
insert #t (id, val) values (1,'a') 
insert #t (id, val) values (1,'a') 
insert #t (id, val) values (2,'b') 

insert #t (id, val) values (1,'a') 
insert #t (id, val) values (2,'b') 
insert #t (id, val) values (2,'b') 
select * from #t 

select * from ( 
select *, row_number() over (partition by id order by id) as rn from #t 
) k where rn=1 


drop table #t 

結果是可變的,取決於插入的順序,但不能始終如一第一插入的行。

2

不,行的順序只能由ORDER BY子句確定 - 如果您的ORDER BY子句在兩行之間不是確定性的,則它們返回的順序是任意的。你需要添加一些東西來分解它們才能做到這一點。然而,作爲一般規則,大多數表格應該有一個唯一的或主鍵 - 從而給你一些你可以點的東西。

多種因素可影響它,如企業版旋轉木馬輪掃描,聚簇索引的重新索引等