2017-08-30 16 views
0

あるテーブルのデータを別のテーブルにマージしようとしています。重複するキーで別のテーブルのテーブルを更新する

表1(Tab1を)

ID col2 col3 col_to_update 
1 s1  a1  null 
2 s1  a2  null 
3 s1  a2  null 
4 s2  a1  null 
5 s3  a1  null 
6 s4  a1  null 

表2(TAB2)

ID col2 col3 col4 
10 s1  a1  v1 
11 s1  a1  v2 
12 s1  a2  v3 
13 s2  a1  v4 
14 s3  a1  v5 
15 s4  a1  v6 
16 s4  a1  v7 

Iは、テーブルの列col_to_updateにテーブルTab2からカラムcol4をマッピングしようとしていTab1Tab1.col2 = Tab2.col2Tabl.col3 = Tab2.col3のマッチングに基づきます期待される出力以下になるようにする:

予想される出力0

ID col2 col3 col4 
1 s1  a1  v1 
2 s1  a2  v3 
3 s1  a2  v3 
4 s2  a1  v4 
5 s3  a1  v5 
6 s4  a1  v6 
は、私は、クエリ以下で失敗してみました:

MERGE INTO Tab1 x1 
USING 
(
    SELECT t1.id as t1id, t2.id as t2id, t2.col2 t2col2, t2.col3 t2col3, t2.col4 from Tab2 t2 
    JOIN Tab1 t1 ON t2.col2 = t1.col2 AND t2.col3 = t1.col3 
) x2 
ON (x1.id = x2.t1id) 
WHEN MATCHED THEN UPDATE SET 
x1.col_to_update = x2.col4; 

が期待される出力を取得する方法があります。

+2

:「ソース」の表にアップデートするために使用されるべき値のための複数の候補があります。潜在的な候補のうちのどれを使用すべきですか?あなたの例では、ID = 1のために、なぜあなたはTab2からv1ではなくv2を選択しましたか? – mathguy

+0

はいTab2には複数の潜在的な一致があります。最初に一致するものまたは一致するものをマップすることを期待しています。 – Brij

+0

"最初の"は定義されていません - 注文はありますか?または、最小値を意味しますか? Thorstenはすでにそれを行う方法を示しています。 – mathguy

答えて

1

あなたは単にたいtab1更新へ:これは意味がありません

update tab1 
set col_to_update = 
(
    select min(tab2.col4) -- or whichever value you want to use 
    from tab2 
    where tab2.col2 = tab1.col2 
    and tab2.col3 = tab1.col3 
); 
+0

なぜこれは動作すると思いますか?あなたはその質問を読んだのですか? **本当に**それを読んで? – mathguy

+0

@mathguy:もちろんそうです。要求は不完全であり、複数の一致がある可能性があるため、どの値を設定するかを決定するルールが必要です。私。 'select min(tab2.col4)'を実行します。私はそれに応じて私の答えを更新しました。 –

関連する問題