2

(「どのように機能するか」-質問)

私がこのテーブルを持っているとしましょう:

   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(条項に注意してください)。注文は挿入された注文と見なされますか?

4

2 に答える 2

2

動作は保証されません。クエリは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

結果は挿入の順序に応じて変化しますが、最初に挿入された行が一貫しているわけではありません。

于 2012-09-13T08:47:40.653 に答える
2

いいえ、行の順序はORDER BY句によってのみ決定できます。ORDER BY句が2つの行の間で決定論的でない場合、それらが返される順序は任意です。それを可能にするために、それらを一意化するために何かを追加する必要があります。ただし、原則として、ほとんどのテーブルには一意のキーまたは主キーが必要です。これにより、注文できるものが提供されます。

Enterpriseエディションでのメリーゴーランドスキャン、クラスター化されたインデックスのインデックスの再作成など、さまざまなことが影響を与える可能性があります。

于 2012-09-13T08:48:50.620 に答える