다음 두 테이블이 있습니다.
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