SQL插入记录不存在的地方

时间:2017-04-14 14:38:28

标签: sql sql-server insert-into

我有一个自动流程,每周都会将数据附加到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

3 个答案:

答案 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
)