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는 삽입되지 않습니다...
두 번째로 실행하면 다음을 얻을 수 있습니다.
기본 키 제약 조건 위반 오류
코드는 다음과 같습니다.
Insert into Table_2
Select distinct *
from Table_1
where table_1.ID >1
사용.ignore Duplicates
IanC가 제안한 것처럼 고유한 인덱스에 비슷한 문제에 대한 나의 해결책이 있었고, 옵션으로 인덱스를 만들었습니다.WITH IGNORE_DUP_KEY
In backward compatible syntax
, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.
참조: index_option
SQL Server에서 테이블의 고유 키 인덱스(유일해야 하는 열)를 설정할 수 있습니다.
약간 주제가 다르지만 데이터를 새 테이블로 마이그레이션하려는 경우 중복될 수 있는 항목이 원래 테이블에 있고 중복될 수 있는 열이 ID가 아닐 수 있습니다.GROUP BY
할 일:
INSERT INTO TABLE_2
(name)
SELECT t1.name
FROM TABLE_1 t1
GROUP BY t1.name
저의 경우, 소스 테이블에 중복된 ID가 있어서 어떤 제안도 효과가 없었습니다.성능은 신경 안 써요, 한 번만 하면 돼요.이를 해결하기 위해 중복된 내용을 무시하기 위해 커서로 기록을 하나씩 가져갔습니다.
코드 예제는 다음과 같습니다.
DECLARE @c1 AS VARCHAR(12);
DECLARE @c2 AS VARCHAR(250);
DECLARE @c3 AS VARCHAR(250);
DECLARE MY_cursor CURSOR STATIC FOR
Select
c1,
c2,
c3
from T2
where ....;
OPEN MY_cursor
FETCH NEXT FROM MY_cursor INTO @c1, @c2, @c3
WHILE @@FETCH_STATUS = 0
BEGIN
if (select count(1)
from T1
where a1 = @c1
and a2 = @c2
) = 0
INSERT INTO T1
values (@c1, @c2, @c3)
FETCH NEXT FROM MY_cursor INTO @c1, @c2, @c3
END
CLOSE MY_cursor
DEALLOCATE MY_cursor
MERGE 쿼리를 사용하여 중복 없이 테이블을 채웠습니다.내가 가진 문제는 테이블(코드, 값)의 이중 키였고, 기존 쿼리는 매우 느렸습니다. MERGE가 매우 빠르게 실행되었습니다(X100보다 더 많이).
하나의 테이블에 대해 여러 필드에서 하나의 고유 인덱스를 만들 때 완벽하게 작동합니다.그런 다음 7개 필드(이 경우)의 값이 모두 동일한 경우 "INSERT IGNORE"는 중복 항목을 무시합니다.
PMA 구조 보기에서 필드를 선택하고 고유를 클릭하면 새 결합 인덱스가 만들어집니다.
단한.DELETE
INSERT
충분할 것입니다.
DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
»Table1
위해서Table2
테이블의 Id
그리고.name
유지할 쌍을 지정합니다.
언급URL : https://stackoverflow.com/questions/2513174/avoid-duplicates-in-insert-into-select-query-in-sql-server
'programing' 카테고리의 다른 글
에서 전자 메일 주소 형식을 확인하려면 어떻게 해야 합니까?NET Framework? (0) | 2023.05.09 |
---|---|
iOS Swift App의 백그라운드 보기에 그라데이션을 적용하는 방법 (0) | 2023.05.09 |
오브젝티브-C 대신 C++를 코코아와 함께 사용하시겠습니까? (0) | 2023.05.09 |
테스트 작업에 대해 Xcode 프로젝트 구성표가 현재 구성되어 있지 않습니다. (0) | 2023.05.09 |
마지막 커밋 후 모든 변경 사항 재설정 (0) | 2023.05.09 |