Подтвердить что ты не робот

Скопируйте строки из одной таблицы в другую, игнорируя дубликаты

У меня есть 2 таблицы (srcTable1 и destTable), которые имеют одинаковые схемы. Я пытаюсь скопировать все строки из srcTable в destTable и игнорировать дубликаты. Я думал, что могу просто добавить предложение WHERE с подзапросом, который даст мне только строки, которые не дублируются. Однако, похоже, это не работает. Я не получаю никаких вставленных или выбранных строк.

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)

Однако мои таблицы имеют несколько ключей, и я не могу придумать, как вы могли бы это сделать с помощью нескольких клавиш.

Любая идея, что я делаю неправильно, или у вас есть лучшие идеи?

4b9b3361

Ответ 1

Ваша проблема в том, что вам нужно другое предложение 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  

Еще одна вещь. Я также предлагаю указать конкретные поля в инструкции insert вместо использования SELECT *.

Ответ 2

Я понимаю, что это старо, но я попал сюда из Google и после рассмотрения принятого ответа я сделал свое собственное выражение, и это сработало для меня, надеюсь, что кто-то найдет его полезным:

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

Изменить: это работает на MySQL, я не тестировал MSSQL

Ответ 3

Что-то вроде этого?:

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

Ответ 4

Я надеюсь, что этот запрос поможет вам

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

Ответ 5

Вы пробовали SELECT DISTINCT?

INSERT INTO destTable
SELECT DISTINCT * FROM srcTable

Ответ 6

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 .....)
    )

Ответ 7

DISTINCT - ключевое слово, которое вы ищете.

В MSSQL копирование уникальных строк из таблицы в другую может быть выполнено следующим образом:

SELECT DISTINCT column_name
INTO newTable
FROM srcTable

column_name - это столбец, в котором вы ищете уникальные значения.

Протестировано и работает.

Ответ 8

Решение, которое работало для меня с PHP/PDO.

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>");}
}

}