避免在SQL Server中的SELECT查询中插入重复
-
22-09-2019 - |
题
我有以下两个表:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
我需要从 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是否有类似的东西?
我只是遇到了类似的问题,独特的关键字奏效了魔术:
INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
使用 ignore Duplicates
在唯一索引上 正如IANC所建议的 是我解决类似问题的解决方案,创建与选项的索引 WITH IGNORE_DUP_KEY
In backward compatible syntax
, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.
参考: index_option
我最近面临着同样的问题...
Heres在MS SQL Server 2017中对我有用的东西...
主键应在表2中的ID上设置。
当然,两张表之间的列和列属性应相同。这将在您第一次运行以下脚本时工作。表1中的重复ID不会插入...
如果第二次运行,您将得到一个
违反主要密钥约束错误
这是代码:
Insert into Table_2
Select distinct *
from Table_1
where table_1.ID >1
有点偏离主题,但是如果您想将数据迁移到新表格,并且可能的重复项在 原始桌子, ,列可能重复的不是ID,一个 GROUP BY
会做:
INSERT INTO TABLE_2
(name)
SELECT t1.name
FROM TABLE_1 t1
GROUP BY t1.name
一个简单的 DELETE
之前 INSERT
就足够了:
DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
交换 Table1
为了 Table2
取决于哪个桌子 Id
和 name
配对您要保存。
不隶属于 StackOverflow