2017-04-14 19 views
0

我有一个自动的过程,每周将数据附加到Table1。它只有4列[Reason, Number of Occurences, Sent Date, and Program]Table1不断增长,不关心重复记录。 (每周只有26个记录,只有4列,所以表演/空间不是问题)SQL插入到不存在记录的位置

我有另一个表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

IMO如果使用IF语句,你在做什么会更具有可读性。 – Seano666

+1

你真的需要两张桌子 - 为什么不只是让table2成为table1的视图? – Hogan

+0

@霍根,你知道什么...这实际上可能是一个选项。我会提出来的。 – MattR

回答

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,所以它不是做你的期望。

+0

谢谢。不知道,除了是使用的东西。这完全是一个MS SQL Server的东西,还是你可以在Oracle这样的东西中使用它?你还会如此友好地链接任何文档?似乎无法找到此,因此StackOverflow问题。 – MattR

+0

@MattR。 。 。这个想法在几个数据库中得到支持。有时它被称为'MINUS'。 –

0

我认为你可以使用MERGE语句,以及这将有只有一个条件WHEN NOT MATCHED BY TARGET,那么你将直接插入目标表中的一行。

注意:请考虑源表中的DISTINCT行。

0

您需要添加一个额外的WHERE在你内心的选择条款比较表2和表1记录:

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 
) 
+0

我想过这样做,但它似乎是一个简单的任务很多代码。 – MattR

+0

如果记录的数量不重要,并且您似乎没有保留任何技术日期(创建者或记录更新)的痕迹,您也可以使用TRUNCATE表格2,然后使用简单的INSERT INTO表格2 SELECT DISTINCT * FROM table1 – ChapL

+0

这是一个有效的观点,我也这么想。但我的团队其他人不喜欢这个想法。但好点。 – MattR

相关问题