복붙노트

[SQL] SQL Server의 INSERT INTO SELECT 쿼리 않도록 중복

SQL

SQL Server의 INSERT INTO SELECT 쿼리 않도록 중복

나는 다음과 같은 두 개의 테이블이 있습니다

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

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

나는 표 1에서 표 2에 데이터를 삽입해야합니다. 나는 다음과 같은 구문을 사용할 수 있습니다 :

INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1

하지만, 내 경우, 중복 ID를 표 2에있을 수 있습니다 (필자의 경우는 "1"그냥) 및 그 오류가 발생하는 것처럼 내가 다시는 복사하지 않습니다.

I는 다음과 같이 쓸 수 있습니다 :

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

ELSE - IF 사용하지 않고이 작업을 수행하는 더 좋은 방법이 있나요? 나는 어떤 조건에 따라 두 INSERT INTO-SELECT 문을 피하려고.

해결법

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

    1.NOT EXISTS 사용 :

    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)
    

    에없는 사용 :

    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을 사용 / 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
    

    세 가지 옵션 중 왼쪽이 가입 / NULL이 덜 효율적이다. 자세한 내용은이 링크를 참조하십시오.

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

    2.MySQL의에서이 작업을 수행 할 수 있습니다 :

    MySQL의에서이 작업을 수행 할 수 있습니다 :

    INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1
    

    합니까 SQL 서버는 유사한 아무것도?

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

    3.난 그냥 DISTINCT 키워드가 마법 작동 비슷한 문제가 있었다 :

    난 그냥 DISTINCT 키워드가 마법 작동 비슷한 문제가 있었다 :

    INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
    
  4. ==============================

    4.IGNORE_DUP_KEY WITH 옵션을 사용하여 인덱스를 생성, IanC에 의해 제안 여기에 유사한 문제에 대한 내 솔루션이었다으로 고유 인덱스에 중복을 무시 사용

    IGNORE_DUP_KEY WITH 옵션을 사용하여 인덱스를 생성, IanC에 의해 제안 여기에 유사한 문제에 대한 내 솔루션이었다으로 고유 인덱스에 중복을 무시 사용

    In backward compatible syntax
    , WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.
    

    참고 : index_option

  5. ==============================

    5.SQL 서버에서 당신은 (필요 고유 할 것을 열)의 테이블에 고유 키 인덱스를 설정할 수 있습니다

    SQL 서버에서 당신은 (필요 고유 할 것을 열)의 테이블에 고유 키 인덱스를 설정할 수 있습니다

  6. ==============================

    6.나는 최근에 같은 문제에 직면했다 ... MS SQL 서버 2017 년 나를 위해 일한 무엇을 Heres ... 기본 키는 표 2에 ID를 설정해야합니다 ... 열 및 열 특성은 두 테이블 사이 물론 동일해야합니다. 이것은 당신이 아래의 스크립트를 처음 실행할 때 작동합니다. 표 1의 중복 된 ID는 삽입하지 않습니다 ...

    나는 최근에 같은 문제에 직면했다 ... MS SQL 서버 2017 년 나를 위해 일한 무엇을 Heres ... 기본 키는 표 2에 ID를 설정해야합니다 ... 열 및 열 특성은 두 테이블 사이 물론 동일해야합니다. 이것은 당신이 아래의 스크립트를 처음 실행할 때 작동합니다. 표 1의 중복 된 ID는 삽입하지 않습니다 ...

    당신이 그것을 두 번째로 실행하면, 당신은 얻을 것이다

    이 코드입니다 :

    Insert into Table_2
    Select distinct *
    from Table_1
    where table_1.ID >1
    
  7. ==============================

    7.새 테이블에 데이터를 마이그레이션 할, 그리고 가능한 중복 원래의 테이블에있는, 그리고 아마도 중복 열이 ID가 아닌 경우 약간의 오프 주제,하지만, 그룹에 의해 할 것입니다 :

    새 테이블에 데이터를 마이그레이션 할, 그리고 가능한 중복 원래의 테이블에있는, 그리고 아마도 중복 열이 ID가 아닌 경우 약간의 오프 주제,하지만, 그룹에 의해 할 것입니다 :

    INSERT INTO TABLE_2
    (name)
      SELECT t1.name
      FROM TABLE_1 t1
      GROUP BY t1.name
    
  8. ==============================

    8.삽입이 충분하기 전에 간단한는 삭제 :

    삽입이 충분하기 전에 간단한는 삭제 :

    DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1)
    INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
    

    표 2는 보존하려는 페어링하는 테이블의 ID와 이름을에 따라 위해 표를 전환.

  9. from https://stackoverflow.com/questions/2513174/avoid-duplicates-in-insert-into-select-query-in-sql-server by cc-by-sa and MIT license