将行从一个表复制到另一个表,忽略重复

Jef*_*ock 36 sql t-sql

我有2个表(srcTable1和destTable)具有相同的模式.我试图将所有行从srcTable复制到destTable并忽略重复项.我以为我可以添加一个带有子查询的WHERE子句,该子查询只给出不重复的行.但是,它似乎不起作用.我没有插入或选择任何行.

INSERT INTO destTable
SELECT * FROM srcTable
WHERE NOT EXISTS(SELECT * FROM destTable)
Run Code Online (Sandbox Code Playgroud)

我意识到我可以这样做:

INSERT INTO destTable
SELECT * FROM srcTable
WHERE MyKey IN (SELECT MyKey FROM destTable)
Run Code Online (Sandbox Code Playgroud)

但是,我的表有多个键,我想不出你如何用多个键做到这一点.

知道我做错了什么,或者你有更好的想法吗?

Joh*_*nFx 47

您的问题是您需要子查询中的另一个where子句来标识复制的内容:

INSERT INTO destTable
SELECT Field1,Field2,Field3,... 
FROM srcTable
WHERE NOT EXISTS(SELECT * 
                 FROM destTable 
                 WHERE (srcTable.Field1=destTable.Field1 and
                       SrcTable.Field2=DestTable.Field2...etc.)
                 )
Run Code Online (Sandbox Code Playgroud)

正如另一个回答者所指出的,外连接可能是一种更简洁的方法.我上面的例子只是尝试解释使用您当前的查询更容易理解.这两种方法都可以在技术上起作用.

INSERT INTO destTable
SELECT s.field1,s.field2,s.field3,... 
FROM srcTable s 
       LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...)
WHERE d.Key1 IS NULL
Run Code Online (Sandbox Code Playgroud)

上述两种方法都假设您担心从源中插入可能已在目标中的行.如果你担心源有重复行的可能性,你应该尝试类似的东西.

INSERT INTO destTable
SELECT Distinct field1,field2,field3,... 
FROM srcTable  
Run Code Online (Sandbox Code Playgroud)

还有一件事.我还建议在insert语句中列出特定字段,而不是使用SELECT*.


Alb*_*cia 17

我意识到这是旧的,但我从谷歌来到这里,在审查了接受的答案后,我做了我自己的陈述,它对我有用,希望有人会发现它有用:

    INSERT IGNORE INTO destTable SELECT id, field2,field3... FROM origTable
Run Code Online (Sandbox Code Playgroud)

编辑:这适用于MySQL我没有在MSSQL上测试

  • 对于MySQL,我需要添加不同的内容。完整查询:`INSERT IGNORE INTO destination_table (field, field1, field2) SELECT DISTINCT field, field1, field2 FROM origin_table` (2认同)

Dan*_*att 5

像这样的东西?:

INSERT INTO destTable
SELECT s.* FROM srcTable s
LEFT JOIN destTable d ON d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...
WHERE d.Key1 IS NULL
Run Code Online (Sandbox Code Playgroud)


小智 5

希望这个查询对您有帮助

INSERT INTO `dTable` (`field1`, `field2`)
SELECT field1, field2 FROM `sTable` 
WHERE `sTable`.`field1` NOT IN (SELECT `field1` FROM `dTable`)
Run Code Online (Sandbox Code Playgroud)