如何避免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中,您可以在表上设置唯一键索引(需要唯一的列)