2012-08-16 3 views
2

하나의 테이블에서 다른 테이블로 데이터를 삽입하려고하는데 중복 행 삽입을 방지하고 싶습니다. 저는 현재 다음과 같은 쿼리를 가지고 :SQL Server 2008을 사용하여 중복 행 삽입 방지

INSERT INTO Table1 
(
    Table1Col1, 
    Table1Col2, 
    Table1Col3, 
    Table1Col4, 
    Table1Col5 
) 
SELECT 
    Table2Col1, 
    Table2Col2 = constant1, 
    Table2Col3 = constant2, 
    Table2Col4 = constant3, 
    Table2Col5 = constant4 
FROM Table2 
WHERE 
    Condition1 = constant5 
AND 
    Condition2 = constant6 
AND 
    Condition3 = constant7 
AND 
    Condition4 LIKE '%constant8%' 

내가 모르는 것은 내가 표에 표 2에서 삽입하려고 행이 이미있을 수 있습니다 나는 이런 일이 발생 가능한 중복을 방지하고 삽입을 건너 뛰고 싶다고 다음 고유 행을 삽입하는 것으로 이동하십시오.

WHERE NOT EXISTS 절을 사용하고 INTERSECT 키워드를 사용할 수 있지만 Table2에서 선택한 데이터 중 일부만 사용하려는 경우 특정 쿼리에 적용하는 방법을 완전히 이해하지 못했습니다. 다음 몇 가지 상수 값을 Table1에 삽입합니다.

편집 :

내가 TableCol5까지 실제로 결과에 존재하지 않는 TableCol2 열을 설정하고 난 그냥 반환 Table2Col1 함께 이러한 열을 채우는 오전 추가해야합니다.

+1

유일해야하는 열에 'UNIQUE' 제약 조건을 정의하면 "중복"삽입이 작동하지 않습니다 (대신 오류가 발생합니다) –

+0

중복 행이 하나는 table1의 행이나 열의 서브 세트와 정확히 동일 하나 고유성을 정의합니까? –

+0

@ NikolaMarkovinović 고유성을 정의하는 Table1Col1, Table1Col2 및 TableCol3의 하위 집합입니다. – Aesir

답변

1

Intersect (마이너스는 SQL 서버의 용어로)는 전체 행을 비교하기 때문에 밖으로 질문입니다. 다른 두 옵션은 not in/not exists/left joinmerge입니다. Not In은 단일 열 prinary 키 전용이므로이 경우에는 문제가되지 않습니다. In/Exists/Left join의 SQL Server에서 동일한 성능을 가져야한다, 그래서 난 그냥 사용합니다 존재합니다

INSERT INTO Table1 
(
    Table1Col1, 
    Table1Col2, 
    Table1Col3, 
    Table1Col4, 
    Table1Col5 
) 
SELECT 
    Table2Col1, 
    Table2Col2 = constant1, 
    Table2Col3 = constant2, 
    Table2Col4 = constant3, 
    Table2Col5 = constant4 
FROM Table2 
WHERE 
    Condition1 = constant5 
AND 
    Condition2 = constant6 
AND 
    Condition3 = constant7 
AND 
    Condition4 LIKE '%constant8%' 
AND NOT EXISTS 
    (
     SELECT * 
     FROM Table1 target 
     WHERE target.Table1Col1 = Table2.Table2Col1 
      AND target.Table1Col2 = Table2.Table2Col2 
      AND target.Table1Col3 = Table2.Table2Col3 
    ) 

Merge 두 테이블을 동기화하는 데 사용됩니다; target table의 레코드를 삽입, 업데이트 및 삭제할 수 있습니다.

표 2에서 열이 전송 중에 계산하는 경우
merge into table1 as target 
using table2 as source 
    on target.Table1Col1 = source.Table2Col1 
    AND target.Table1Col2 = source.Table2Col2 
    AND target.Table1Col3 = source.Table2Col3 
when not matched by target then 
    insert (Table1Col1, 
      Table1Col2, 
      Table1Col3, 
      Table1Col4, 
      Table1Col5) 
    values (Table2Col1, 
      Table2Col2, 
      Table2Col3, 
      Table2Col4, 
      Table2Col5); 

, not exists() 경우에 당신은 표 2의 장소에서 파생 테이블을 사용할 수 있습니다, 그리고 같은 merge 예를 적용 - 단지 표 2 참조 대신에 쿼리를 배치합니다.

3

SQL Server 2008을 사용 중이므로 merge 문을 사용할 수 있습니다.

행이 같은 키

뭔가에 기반을 존재하는 경우 쉽게 확인할 수 있습니다

merge TableMain AS target 
using TableA as source 
ON <join tables here> 
WHEN MATCHED THEN <update> 
WHEN NOT MATCHED BY TARGET <Insert> 
WHEN NOT MATCHED BY SOURCE <delete> 
+0

감사합니다 Diego, 저는 비교적 SQL에 익숙하지 않습니다. WHERE 절과 상수 값 삽입에 대한 쿼리에 더 많이 제공 한 병합 샘플을 관련시킬 수 있습니까? – Aesir

관련 문제