programing

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

megabox 2023. 5. 9. 22:13
반응형

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 DuplicatesIanC가 제안한 것처럼 고유한 인덱스에 비슷한 문제에 대한 나의 해결책이 있었고, 옵션으로 인덱스를 만들었습니다.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

저의 경우, 소스 테이블에 중복된 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보다 더 많이).

MERGE 쿼리 예제

하나의 테이블에 대해 여러 필드에서 하나의 고유 인덱스를 만들 때 완벽하게 작동합니다.그런 다음 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

반응형