[sql] SQL Server의 INSERT INTO SELECT 쿼리에서 중복 방지

다음 두 테이블이 있습니다.

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

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

에서 Table1에 데이터를 삽입해야합니다 Table2. 다음 구문을 사용할 수 있습니다.

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

그러나 제 경우에는 중복 ID가 존재할 수 있으며 Table2(제 경우에는 ” 1” 일뿐 ) 오류가 발생할 수 있으므로 다시 복사하고 싶지 않습니다.

다음과 같이 작성할 수 있습니다.

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

사용하지 않고이 작업을 수행하는 더 좋은 방법이 IF - ELSE있습니까? INSERT INTO-SELECT조건에 따라 두 가지 진술 을 피하고 싶습니다 .



답변

사용 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)

사용 NOT IN:

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/IS 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

세 가지 옵션 중 LEFT JOIN/IS NULL효율성이 떨어집니다. 자세한 내용은 이 링크를 참조하십시오 .


답변

MySQL에서는 다음을 수행 할 수 있습니다.

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

SQL Server에도 비슷한 것이 있습니까?


답변

비슷한 문제가 있었는데 DISTINCT 키워드가 마술처럼 작동합니다.

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


답변

나는 최근에 같은 문제에 직면했다 …
MS SQL 서버 2017에서 나를 위해 일한 것은 다음과 같다 …
기본 키는 표 2의 ID에 설정되어야한다 …
물론 열과 열 속성은 둘 다 동일해야한다 테이블. 아래 스크립트를 처음 실행할 때 작동합니다. 표 1의 중복 ID는 삽입되지 않습니다.

두 번째로 실행하면

PRIMARY KEY 제약 조건 위반 오류

다음은 코드입니다.

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


답변

IanC가 제안한ignore Duplicates 고유 인덱스 사용 하여 유사한 문제에 대한 솔루션을 사용하여 Option으로 인덱스를 생성했습니다.WITH IGNORE_DUP_KEY

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

참조 : index_option


답변

SQL Server 에서 테이블에 대한 고유 키 인덱스를 설정할 수 있습니다 (고유해야하는 열).

SQL Server에서 테이블 디자인을 마우스 오른쪽 버튼으로 클릭하고 인덱스 / 키를 선택합니다.

중복되지 않을 열을 선택한 다음 고유 키를 입력합니다.


답변

약간 벗어난 주제이지만 데이터를 새 테이블로 마이그레이션하고 가능한 중복이 원래 테이블 에 있고 중복 가능성이있는 열이 ID가 아닌 경우 다음 GROUP BY을 수행합니다.

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