2016-08-11 3 views
0

外部キーの最小値に基づいてテーブルを更新する方が効率的です。TOPと自己結合を使用した更新

この例では、フラグを設定した行を削除します。

+----+------------+-----------+------------+ 
| id | fk_id  | fk_id2 | some_flag | 
+----+------------+-----------+------------+ 
| 1 | 21   | 1010101 |   1 | 
| 2 | 22   | 1010101 |   0 | 
| 3 | 23   | 1010101 |   0 | 
| 4 | 24   | 1010101 |   0 | 
+----+------------+-----------+------------+ 

私のアプローチは、私が感じて、次の

Update t1 
set some_flag = 1 
From TableA t1 
Left Join TableA t2 
on t1.fk_id2 = t2.fk_id2 AND t1.fk_id > t2.fk_id 
where t1.fk_id2 = 1010101 AND t2.fk_id2 IS NULL 

を使用して自分自身に、テーブルに参加してきました:私は、テーブルレイアウト

最小fk_idでの行にフラグを設定したいですこのように効率的ではなく、よりよい方法が必要です。

selectステートメントに基づいて更新することについての考えですが、おそらくそれは良くないでしょう。私は私のソリューションは、フィールドの多くのテーブルの悪いと仮定します。

答えて

2

使用ウィンドウ機能:

with toupdate as (
     select a.*, row_number() over (partition by fk_id2 order by fk_id) as seqnum 
     from table a 
    ) 
update toupdate 
    set some_flag = 1 
    where seqnum = 1; 

joinまたはtopのいずれかのための必要はありません。

+0

私は、さまざまなオプション間で実行計画がどのように違うのかを見ることに興味があります。 –

+0

これがより良いアプローチである理由を説明するのに気をつけますか?より混乱しているIMOのようだ。また、これはストアドプロシージャ内でどのように機能しますか? – Triplell89

+1

@ Triplell89あなたがそれを知らないので、ちょっと複雑です。それは私が読みやすく、より効率的です。 – Paparazzi