[SQL] SQL Server의 INSERT INTO SELECT 쿼리 않도록 중복
SQLSQL 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.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.MySQL의에서이 작업을 수행 할 수 있습니다 :
MySQL의에서이 작업을 수행 할 수 있습니다 :
INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1
합니까 SQL 서버는 유사한 아무것도?
-
==============================
3.난 그냥 DISTINCT 키워드가 마법 작동 비슷한 문제가 있었다 :
난 그냥 DISTINCT 키워드가 마법 작동 비슷한 문제가 있었다 :
INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1
-
==============================
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.SQL 서버에서 당신은 (필요 고유 할 것을 열)의 테이블에 고유 키 인덱스를 설정할 수 있습니다
SQL 서버에서 당신은 (필요 고유 할 것을 열)의 테이블에 고유 키 인덱스를 설정할 수 있습니다
-
==============================
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.새 테이블에 데이터를 마이그레이션 할, 그리고 가능한 중복 원래의 테이블에있는, 그리고 아마도 중복 열이 ID가 아닌 경우 약간의 오프 주제,하지만, 그룹에 의해 할 것입니다 :
새 테이블에 데이터를 마이그레이션 할, 그리고 가능한 중복 원래의 테이블에있는, 그리고 아마도 중복 열이 ID가 아닌 경우 약간의 오프 주제,하지만, 그룹에 의해 할 것입니다 :
INSERT INTO TABLE_2 (name) SELECT t1.name FROM TABLE_1 t1 GROUP BY t1.name
-
==============================
8.삽입이 충분하기 전에 간단한는 삭제 :
삽입이 충분하기 전에 간단한는 삭제 :
DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1) INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
표 2는 보존하려는 페어링하는 테이블의 ID와 이름을에 따라 위해 표를 전환.
from https://stackoverflow.com/questions/2513174/avoid-duplicates-in-insert-into-select-query-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 - 오류에 거래 롤 다시? (0) | 2020.03.28 |
---|---|
[SQL] SQL 서버 2005/2008에서 요일을 가져 오기 (0) | 2020.03.28 |
[SQL] 어떻게 오라클의 테이블에서 열 이름을 얻을 수 있나요? (0) | 2020.03.28 |
[SQL] 사용자 당 가장 최근 날짜를 선택 행 (0) | 2020.03.28 |
[SQL] 일시적으로 제약을 해제 (MS SQL) (0) | 2020.03.28 |