복붙노트

[SQL] 중복을 무시하고, 다른 한 테이블에서 행을 복사

SQL

중복을 무시하고, 다른 한 테이블에서 행을 복사

나는 동일한 스키마를 가지고 2 개 테이블 (srcTable1 & destTable)가 있습니다. 나는 destTable에 srcTable에서 모든 행을 복사하고 중복을 무시하려합니다. 난 그냥 나에게 중복되지 만 행을 줄 것이다 하위 쿼리에 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)

하지만, 내 표는 여러 개의 키를 가지고 난 당신이 여러 개의 키와 함께 할 수있는 방법을 생각할 수 없다.

어떤 생각이 내가 잘못을 뭘하는지 아니면 더 좋은 아이디어를 가지고 있습니까?

해결법

  1. ==============================

    1.귀하의 문제는 서브 쿼리에 다른 곳에 절을 필요로한다는 것입니다 그 복제를 만드는 것 식별 :

    귀하의 문제는 서브 쿼리에 다른 곳에 절을 필요로한다는 것입니다 그 복제를 만드는 것 식별 :

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

    또 다른 응답자에 의해 언급 한 바와 같이, 외부 조인 아마 더 간결한 방법입니다. 내 위의 예는 더 understandible로 현재 쿼리를 사용하여 설명 할 그냥 시도였다. 어느 접근 방식은 기술적으로 일할 수 있습니다.

    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
    

    위의 방법은 모두 이미 목적지에있을 소스에서 행을 삽입하는 방법에 대한 woried 가정합니다. 당신이 대신 가능성에 대해 우려하는 경우 해당 소스 당신이 뭔가를 시도해야 중복 행이 있습니다.

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

    하나 더. 나는 또한 당신 삽입 명세서에 특정 필드를 나열하는 대신에 SELECT *를 사용하는 것이 좋습니다 것입니다.

  2. ==============================

    2.나는이 오래 실현,하지만 난 구글에서 나는 내 자신의 진술을 한 허용 대답을 검토 한 후 여기에 도착 나를 누군가가 유용 희망을 위해 일했다 :

    나는이 오래 실현,하지만 난 구글에서 나는 내 자신의 진술을 한 허용 대답을 검토 한 후 여기에 도착 나를 누군가가 유용 희망을 위해 일했다 :

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

    편집 : MySQL의 I에이 작품은 MSSQL에서 테스트하지 않았다

  3. ==============================

    3.나는이 쿼리가 당신을 도움이되기를 바랍니다

    나는이 쿼리가 당신을 도움이되기를 바랍니다

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

    4.이 같은?:

    이 같은?:

    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
    
  5. ==============================

    5.당신이 DISTINCT SELECT 시도?

    당신이 DISTINCT SELECT 시도?

    INSERT INTO destTable
    SELECT DISTINCT * FROM srcTable
    
  6. ==============================

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

    7.DISTINCT는 당신이 찾고있는 키워드입니다.

    DISTINCT는 당신이 찾고있는 키워드입니다.

    MSSQL에서 다른 테이블에서 고유 한 행을 복사하면 다음과 같이 수행 할 수 있습니다 :

    SELECT DISTINCT column_name
    INTO newTable
    FROM srcTable
    

    아니오 COLUMN_NAME은에서 고유 한 값을 검색하는 열입니다.

    테스트 및 작동합니다.

  8. ==============================

    8.PHP / PDO와 나를 위해 일한 솔루션.

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

    }

  9. ==============================

    9.당신은 서브 쿼리의 첫번째 제거 중복을 시도 했습니까?

    당신은 서브 쿼리의 첫번째 제거 중복을 시도 했습니까?

    INSERT INTO destTable
    SELECT source.* FROM(
        SELECT *
        FROM srcTable
        EXCEPT
        SELECT src.* FROM
        srcTable AS src
        INNER JOIN destTable AS dest 
        /* put in below line the conditions to match repeated registers */
            ON dest.SOME_FANCY_MATCH = src.SOME_FANCY_MATCH AND ... 
    ) as source
    

    세트가 매우 큰 경우, 아마도 이것이 최선의 해결책이 아니다.

  10. from https://stackoverflow.com/questions/656012/copy-rows-from-one-table-to-another-ignoring-duplicates by cc-by-sa and MIT license