2016-12-14 49 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