我有2个完全相同的表:table1(a,b,c)和table2(a,b,c)
但是每天晚上,t2
都会更新,在更新之后,我想联接这两个表,如果该行存在于t1
中,则更新t1.b
,但是如果没有然后将t2
中的行插入t1
中。
我知道这可行,因为它是选择的
SELECT
(CASE
WHEN t1.a IS NOT NULL
THEN t1.b + t2.b
ELSE t2.b
END) AS 'total new amount'
FROM
table1 t1
RIGHT JOIN
table2 t2 ON t2.a = t1.a AND t2.c = t1.c
但是如何进行更新和插入?
更新:
所以我认为我必须使用MERGE命令
MERGE table1 as t1
USING table2 as t2
ON (t1.a = t2.a AND t1.c = t2.c )
when MATCHED T
HEN UPDATE SET t1.b = t1.b + t2.b
when NOT MATCHED
THEN insert (a,b,c) VALUES (t2.a,t2.b,t2.c);
但是现在我收到此错误:
MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时,就会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。
我在这里做错了什么?
预先感谢
答案 0 :(得分:0)
但是,每天晚上,t2都会更新,并且在此更新之后,我想联接这两个表,如果该行存在于t1中,则更新t1.b,但如果不存在,则将t2中的行插入t1。 / p>
t1有什么事吗?
如果t1
中没有任何变化,则最简单的同步表的方法是截断并重新加载
取决于表中有多少条记录以及更改的速度,这可能比进行高验证更快或更慢。
TRUNCATE TABLE T1;
INSERT INTO T1 (Col1,Col2,Col3)
SELECT Col1,Col2,Col3 FROM T2;
根据使用T1的频率,有多种方法可以使此信息对最终用户透明。 (即他们永远不会看到一个空表)
一些方法是:
SWITCH PARTITION
https://littlekendra.com/2017/01/19/why-you-should-switch-in-staging-tables-instead-of-renaming/ sp_rename
MERGE
当然是进行更新的一种方法,但单独的INSERT
和UPDATE
语句通常更易于调试和执行。