SQL Server基于联接2个表的更新和插入

时间:2018-08-12 18:46:14

标签: sql-server insert-update jointable

我有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子句对源行进行分组。

我在这里做错了什么?

预先感谢

1 个答案:

答案 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的频率,有多种方法可以使此信息对最终用户透明。 (即他们永远不会看到一个空表)

一些方法是:

MERGE当然是进行更新的一种方法,但单独的INSERTUPDATE语句通常更易于调试和执行。