如何避免SQL Server中的INSERT INTO SELECT查询中的重复项?
我有以下两张表:
Table1 ------------- ID Name 1 A 2 B 3 C Table2 -------- ID Name 1 Z  我需要从Table1到Table1 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中,您可以在表上设置唯一键索引(需要唯一的列)
  
 
 