2016-12-16 2 views
2

줄이 이미 존재하는 경우 삽입하지 않는 것이 가장 좋은 방법을 찾는 솔루션을 찾고있었습니다. 나는 어떤 점에서 다른 점을 알기 위해 많은 대답을 읽었다.SQL에 중복을 삽입하지 마십시오.

예를 들어 다음과 같은 포스트 상단 결과입니다 SQL Server Insert if not exist 그러나 변수를 사용하는 이유를 이해할 수 없다 내가 표 1과 표 2를 정의하는 방법에 대해 설명합니다. 누군가 내게 상황을 적용 할 수 있도록 이것을 더 설명 할 수 있을까요?

내 예제에서는 약 5 열 (날짜, Number1, Number2, Text1, Text2) table2에서 삽입하고 싶습니다 있지만 존재하지 않는 경우에만 있습니다. 업데이트가 필요하지 않습니다. 따라서 병합은 문제가되지 않습니다.

+3

우리는 당신을 알 필요가 테이블 구조 (두 테이블 모두)를 사용하면 도움이됩니다. 샘플 데이터와 "중복"정의가 필요할 수도 있습니다. – Siyual

답변

1

상관 관계가있는 하위 쿼리를 사용해야 작동하지 않습니다.

sub select는 삽입하려는 모든 필드에서 조인하여 Table2에 존재하지 않는 Table1의 모든 레코드를 식별합니다. 이렇게하면 table2에 아직없는 레코드 만 삽입 할 수 있습니다. 우리가 서브 쿼리에서 일회용의로 선택 어떤 값을 걱정하지 않는다 때문에하지 상관 하위 쿼리 존재에서

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) 
VALUES 
    (SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
     FROM Table1 A 
     WHERE NOT EXISTS (SELECT 1 
         FROM Table2 B 
         WHERE A.Date = B.Date 
          AND A.Number1 = B.Number1 
          AND A.Number2 = B.Number2 
          AND A.Text1 = B.Text1 
          AND A.Text2 = B.Text2)) 

, 단순히 하나를 선택합니다.

고려해야 할 다른 열이있는 경우 쿼리에 추가해야하거나 기본 키가 모든 열 대신 고려할 수 있다면 우리는이 열에 합류하면됩니다 .

1

NOT EXISTS를 사용하는 대신, Table1Table2 모두에서 선택한 두 개의 결과 집합의 데이터 사이의 "차이", 수행 할 EXCEPT 키워드를 사용하는 것입니다 :

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) values 
SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
FROM Table1 A 
EXCEPT 
SELECT B.Date, B.Number1, B.Number2, B.Text1, B.Text2 
FROM Table2 B; 
관련 문제