(編集:誰でも試してみたい場合には、これはSQLフィドルのURLです:http://sqlfiddle.com/#!9/39c72c/1)更新する方法(マージ)
と仮定私は以下のように見えるテーブルA
があります。
col_1 col_2 cnt_1 mapped_val
A1 B1 10 mapped_A1
A2 B2 5 mapped_A2
A3 B3 0 mapped_A3
....
私も以下のように見えるの表B
持っている:表B
の行のそれぞれについて
col_1 col_2 cnt_1 mapped_val
A1 B1 20 update_to_this
A2 B2 5 do_not_update_to_this
D1 D2 5 mapped_D1
E3 E3 0 mapped_E3
....
を、私は思いますcol_1
とcol_2
を使用してテーブルA
でそれをルックアップするために好きで、テーブルA
のcnt_1
がテーブルB
のそれよりも小さい場合には、その後、私はテーブルB
のそれとテーブルA
にcnt_1
とmapped_val
エントリを更新したいと思います。一致しないテーブルB
のものについては、テーブルA
に追加したいと思います。表A
に、このような操作を適用することによって、結果は次のようになります。
col_1 col_2 cnt_1 mapped_val
A1 B1 20 update_to_this
A2 B2 5 mapped_A2
A3 B3 0 mapped_A3
D1 D2 5 mapped_D1
E3 E3 0 mapped_E3
....
私はMERGE INTO
は(私の最高は、以下試してくださいを参照してください)これを達成するに近づくが、私は一部として比較ロジックを実装するかどうかはわかりませんだと思いますMERGE INTO
クエリの
MERGE INTO
A AS a
USING
B AS b
ON
a.col_1 = b.col_1
AND
a.col_2 = b.col_2
WHEN MATCHED -- AND a.cnt_1 < b.cnt_1?
THEN UPDATE
SET
a.cnt_1 = b.cnt_1,
a.mapped_val = b.mapped_val
WHEN NOT MATCHED -- AND a.cnt_1 < b.cnt_1?
THEN INSERT
(col_1, col_2, cnt_1, mapped_val)
VALUES
(b.col_1, b.col_2, b.cnt_1, b.mapped_val);
ご回答いただきありがとうございます。
ありがとうございました。私はそれを試みました、そして、それは私が達成したいものに非常に近いです。唯一の例外は、結果として「B」の表の「A2 \t B2 do_not_update_this'行が追加されたことです。私は誰かがそれを刺すような場合に備えて、SQLのフィドルリンクで私の質問を更新しました。ありがとうございました。 – user1330974
それでは、 'WHEN MATCHEDとa.cnt1
私はちょうどそのために試しましたが、MATCHEDとa.cnt1が構文的にVertica(あるいは多分一般的なSQL)でも許されるとは思いません。提案していただきありがとうございます。 –
user1330974