如何在表中存在类似项时更新(合并)

时间:2016-12-14 19:28:57

标签: sql vertica

(编辑:如果有人想尝试,这是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中的每一行,我想使用Acol_1在表col_2中查找,如果{{表cnt_1的1}}小于表A的表格,然后我想更新表B中的cnt_1mapped_val个条目与表A的表格相同。对于表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

提前感谢您的回答/建议!

1 个答案:

答案 0 :(得分:0)

我对Vertica语法并不是100%肯定,但我相信这应该只是起作用:

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

的资格