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_1
和col_2
表A
,如果表A
的cnt_1
比表B
小,那么我想更新表A
cnt_1
和mapped_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);
非常感谢您的回答/建议!
谢谢你的回答。我试过了,它非常接近我想达到的目标。唯一的例外是,表'B'中的do_not_update_this'行因此被添加到'A'中。我用SQL小提琴链接更新了我的问题,以防有人想要刺戳它。再次感谢你。 – user1330974
那么,我猜你的原始查询与'WHEN MATCHED AND a.cnt1
我只是为了它而试过,但我不认为'WHEN MATCHED和a.cnt1
user1330974