我有以下两个表:

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

Table2
----------
ID   Name
1    Z

我需要从 Table1Table2. 。我可以使用以下语法:

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

从SQL Server您可以设置一个 唯一的钥匙 表上的索引(需要唯一的列)

From sql server right click on the table design select Indexes/Keys

Select column(s) that will be not duplicate , then type Unique Key

我最近面临着同样的问题...
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 取决于哪个桌子 Idname 配对您要保存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top