2016-12-14 50 views
0

(編輯:如果有人想嘗試,這是SQL小提琴網址: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看起來象下面這樣:

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 
.... 

對於每一行的表B,我喜歡看它在使用col_1col_2A,如果表Acnt_1比表B小,那麼我想更新表Acnt_1mapped_val項與該表B的。對於不匹配的表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

我不是100%地肯定Vertica的語法,但我相信這應該簡單工作:

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 MATCHED AND做法,符合您ON謂詞,將不符合的元組WHEN NOT MATCHED

+0

謝謝你的回答。我試過了,它非常接近我想達到的目標。唯一的例外是,表'B'中的do_not_update_this'行因此被添加到'A'中。我用SQL小提琴鏈接更新了我的問題,以防有人想要刺戳它。再次感謝你。 – user1330974

+0

那麼,我猜你的原始查詢與'WHEN MATCHED AND a.cnt1

+0

我只是爲了它而試過,但我不認爲'WHEN MATCHED和a.cnt1 user1330974