我有一个自动流程,每周都会将数据附加到Table1
。它只有4列[Reason, Number of Occurences, Sent Date, and Program]
。 Table1
不断增长,并不关心重复记录。 (每周只有26个记录,只有4个列,因此性能/空间不是问题)
我有另一张表Table2
我只想要来自Table1
的独特记录。如果记录已存在于Table 2
中,我不想插入记录。
我认为下面的声明会起作用,但它没有:
begin transaction
insert into [Database]..[Table2]
select Distinct * from [Database]..[Table1]
where not exists (select * from [Database]..[Table2])
(0 row(s) affected)
如果我注释掉WHERE子句,它会起作用,但它会插入Table2
begin transaction
insert into [Database]..[Table2]
select Distinct * from [Database]..[Table1]
--where not exists (select * from [Database]..[Table2])
(83 row(s) affected)
如何检查Table1
中的不同记录,如果Table2
中不存在该记录,请插入该记录?
我正在使用MS SQL Server版本11.0.6020.0
答案 0 :(得分:3)
在SQL Server中,您将使用except
。假设表格具有相同的列:
insert into [Database]..[Table2]
select Distinct t1.*
from [Database]..[Table1] t1
except
select t2.*
from [Database]..[Table2] t2;
您的not exists
子句与table1
中的数据无关,因此它没有达到预期效果。
答案 1 :(得分:0)
我认为你也可以使用MERGE语句,它只有一个条件,而不是TARGET匹配,那么你将直接在目标表中插入行。
注意:请考虑源表中的DISTINCT行。
答案 2 :(得分:0)
您需要在内部选择中添加一个额外的WHERE子句来比较table2和table1记录:
begin transaction
insert into [Database]..[Table2]
select Distinct * from [Database]..[Table1] t1
where not exists (
select * from [Database]..[Table2] t2
where t1.reason=t2.reason
AND t1.occurences=t2.occurences
AND t1.sent_date=t2.sent_date
AND t1.program=t2.program
)