(编辑:如果有人想尝试,这是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
中的每一行,我想使用A
和col_1
在表col_2
中查找,如果{{表cnt_1
的1}}小于表A
的表格,然后我想更新表B
中的cnt_1
和mapped_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
提前感谢您的回答/建议!
答案 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