2016-12-14 6 views
0

(編集:誰でも試してみたい場合には、これは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_1col_2を使用してテーブルAでそれをルックアップするために好きで、テーブルAcnt_1がテーブルBのそれよりも小さい場合には、その後、私はテーブルBのそれとテーブルAcnt_1mapped_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); 

ご回答いただきありがとうございます。

答えて

0

私はのVerticaの構文約100%わからないんだけど、私は、これは単純に動作するはずと信じて:あなたはWHEN MATCHED ANDアプローチを使用する場合は、あなたのON述語に一致するタプルの資格ではないだろうと

MERGE INTO 
    A AS a 
USING 
    B AS b 
ON 
    a.col_1 = b.col_1 
    AND 
    a.col_2 = b.col_2 
    AND 
    a.cnt_1 < b.cnt_1 
WHEN MATCHED 
    THEN UPDATE 
     SET 
      a.cnt_1 = b.cnt_1, 
      a.mapped_val = b.mapped_val 
WHEN NOT MATCHED 
    THEN INSERT 
     (col_1, col_2, cnt_1, mapped_val) 
    VALUES 
     (b.col_1, b.col_2, b.cnt_1, b.mapped_val); 

注意をWHEN NOT MATCHED

+0

ありがとうございました。私はそれを試みました、そして、それは私が達成したいものに非常に近いです。唯一の例外は、結果として「B」の表の「A2 \t B2 do_not_update_this'行が追加されたことです。私は誰かがそれを刺すような場合に備えて、SQLのフィドルリンクで私の質問を更新しました。ありがとうございました。 – user1330974

+0

それでは、 'WHEN MATCHEDとa.cnt1

+0

私はちょうどそのために試しましたが、MATCHEDとa.cnt1 が構文的にVertica(あるいは多分一般的なSQL)でも許されるとは思いません。提案していただきありがとうございます。 – user1330974

関連する問題