如何避免SQL Server中的INSERT INTO SELECT查询中的重复项?

我有以下两张表:

Table1 ------------- ID Name 1 A 2 B 3 C Table2 -------- ID Name 1 Z 

我需要从Table1Table1 Table2插入数据,我可以使用以下语法相同: –

 INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1 

但是,在我的情况下,重复ID可能存在于Table2 (在我的情况下,它只是“ 1 ”),我不想再次复制,因为这将抛出一个错误。

我可以写这样的东西: –

 IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1) INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 ELSE INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1 

有没有更好的方式来做到这一点,而不使用IF - ELSE ? 我想避免两个基于某些条件的INSERT INTO-SELECT语句。

使用NOT EXISTS

 INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 WHERE NOT EXISTS(SELECT id FROM TABLE_2 t2 WHERE t2.id = t1.id) 

使用NOT IN

 INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 WHERE t1.id NOT IN (SELECT id FROM TABLE_2) 

使用LEFT JOIN/IS NULL

 INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 LEFT JOIN TABLE_2 t2 ON t2.id = t1.id WHERE t2.id IS NULL 

在这三个选项中, LEFT JOIN/IS NULL效率较低。 看到这个链接了解更多细节 。

在MySQL中,你可以这样做:

 INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1 

SQL Server有类似的东西吗?

我刚刚有一个类似的问题,DISTINCT关键字的作品神奇:

 INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1 

在IanCbuild议的唯一索引上使用ignore Duplicates在这里是我解决类似问题的方法,用Option WITH IGNORE_DUP_KEY创build索引

 In backward compatible syntax , WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON. 

参考: index_option

从SQL Server中,您可以在表上设置唯一键索引(需要唯一的列)

从sql server右键单击表设计选择索引/键

选择不会重复的列,然后输入唯一密钥