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

我有2个表(srcTable1&destTable)具有相同的模式。 我想从srcTable到destTable复制所有行,并忽略重复。 我以为我可以只添加一个子查询的WHERE子句,只会给我不重复的行。 但是,它似乎并没有工作。 我没有插入或select任何行。

INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable) 

我意识到我可以做这样的事情:

 INSERT INTO destTable SELECT * FROM srcTable WHERE MyKey IN (SELECT MyKey FROM destTable) 

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

任何想法我做错了什么,或者你有什么更好的想法?

你的问题是你在子查询中需要另外一个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.) ) 

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

 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 

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

 INSERT INTO destTable SELECT Distinct field1,field2,field3,... FROM srcTable 

还有一件事。 我也build议您在插入语句中列出特定的字段,而不是使用SELECT *。

我意识到这是旧的,但我从谷歌来到这里,并在审查接受的答案后,我做了我自己的声明,它为我工作,希望有人会觉得它有用:

  INSERT IGNORE INTO destTable SELECT id, field2,field3... FROM origTable 

编辑:这工作在MySQL我没有在MSSQL上testing

像这样的东西?:

 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 

我希望这个查询会帮助你

 INSERT INTO `dTable` (`field1`, `field2`) SELECT field1, field2 FROM `sTable` WHERE `sTable`.`field1` NOT IN (SELECT `field1` FROM `dTable`) 

你有没有尝试过SELECT DISTINCT?

 INSERT INTO destTable SELECT DISTINCT * FROM srcTable 
 insert into tbl2 select field1,field2,... from tbl1 where not exists ( select field1,field2,... from person2 where (tbl1.field1=tbl2.field1 and tbl1.field2=tbl2.field2 and .....) ) 

DISTINCT是您正在寻找的关键字。

在MSSQL中,将表中的唯一行复制到另一个可以这样做:

 SELECT DISTINCT column_name INTO newTable FROM srcTable 

column_name是您正在从中search唯一值的列。

testing和工作。

PHP / PDO为我工作的解决scheme。

 public function createTrainingDatabase($p_iRecordnr){ // Methode: Create an database envirioment for a student by copying the original // @parameter: $p_iRecordNumber, type:integer, scope:local // @var: $this->sPdoQuery, type:string, scope:member // @var: $bSuccess, type:boolean, scope:local // @var: $aTables, type:array, scope:local // @var: $iUsernumber, type:integer, scope:local // @var: $sNewDBName, type:string, scope:local // @var: $iIndex, type:integer, scope:local // -- Create first the name of the new database -- $aStudentcard = $this->fetchUsercardByRecordnr($p_iRecordnr); $iUserNumber = $aStudentcard[0][3]; $sNewDBName = $_SESSION['DB_name']."_".$iUserNumber; // -- Then create the new database -- $this->sPdoQuery = "CREATE DATABASE `".$sNewDBName."`;"; $this->PdoSqlReturnTrue(); // -- Create an array with the tables you want to be copied -- $aTables = array('1eTablename','2ndTablename','3thTablename'); // -- Populate the database -- for ($iIndex = 0; $iIndex < count($aTables); $iIndex++) { // -- Create the table -- $this->sPdoQuery = "CREATE TABLE `".$sNewDBName."`.`".$aTables[$iIndex]."` LIKE `".$_SESSION['DB_name']."`.`".$aTables[$iIndex]."`;"; $bSuccess = $this->PdoSqlReturnTrue(); if(!$bSuccess ){echo("Could not create table: ".$aTables[$iIndex]."<BR>");} else{echo("Created the table ".$aTables[$iIndex]."<BR>");} // -- Fill the table -- $this->sPdoQuery = "REPLACE `".$sNewDBName."`.`".$aTables[$iIndex]."` SELECT * FROM `".$_SESSION['DB_name']."`.`".$aTables[$iIndex]."`"; $bSuccess = $this->PdoSqlReturnTrue(); if(!$bSuccess ){echo("Could not fill table: ".$aTables[$iIndex]."<BR>");} else{echo("Filled table ".$aTables[$index]."<BR>");} } 

}