2016-11-24 10 views
0

안녕하세요. 좋은 하루 되세요. 두 테이블 table2table1에서 다음 시퀀스를 실행하려고합니다.NULL - NULL 열 때문에 UPDATE 대신 INSERT를 시도하는 병합

MERGE INTO table2 WITH (HOLDLOCK) AS target 
    USING 
    (
     SELECT column1, 
      MAX(AccessDate) AS AccessDate, 
      SUM(AccessCount) AS AccessCount, 
      column4, 
      column5, 
      column6, 
      column7, 
      column8 
     FROM table1 
     GROUP BY column1, column4, column5, column6, column7, column8 
    ) AS source 
    ON target.column1 = source.column1 AND 
     target.column5 = source.column5 AND 
     target.column6 = source.column6 AND 
     target.column7 = source.column7 AND 
     target.column8 = source.column8 
    WHEN MATCHED THEN 
    UPDATE SET target.LastAccessDate = source.AccessDate, 
     target.LastWeeklyAccessCount = source.AccessCount 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (column1, LastAccessDate, LastWeeklyAccessCount, column4, column5, column6, column7, column8) 
     VALUES (source.column1, source.AccessDate, source.AccessCount, source.column4, source.column5, source.column6, source.column7, source.column8); 

기존 날짜가 table1 인 경우 수행해야 할 작업이 있습니다. 나는 조건이 충족 가입와 table1 다른 레코드를 삽입하는 경우 , 그것은 두 테이블을 비교했을 때 대신 UPDATE의 때문에 NULL <> NULL의 INSERT하려고이 때문에 내가 가지고있는 UNIQUE 제약 조건의 등장 :

'dbo.table2'객체에 중복 키를 삽입 할 수 없습니다.

누구든지이 문제를 해결할 수 있습니까?

+0

정확히 어떤 필드가 NULL 일 수 있습니까? – gotqn

+0

'column5','column6','column8' –

+0

'null'을'null'과 일치 시키면 올바르게 작동할까요? ((target.column5 = source.column5) OR (target.column5는 NULL이고 source.column5는 NULL입니다. IS NULL)) AND'입니다. 마찬가지로 null 일 수있는 다른 열에 대해서 ... – user1429080

답변

1

하나를 수행하는 방법 :

ON target.column1 = source.column1 AND 
    ISNULL(NULLIF(target.column5, source.column5), 
      NULLIF(source.column5, target.column5)) IS NULL AND 
    ISNULL(NULLIF(target.column6, source.column6), 
      NULLIF(source.column6, target.column6)) IS NULL AND 
    target.column7 = source.column7 AND 
    ISNULL(NULLIF(target.column8, source.column8), 
      NULLIF(source.column8, target.column8)) IS NULL 

NULLIF 두 값이 동일한 경우 (두 값이 널 (null) 인 경우 또는 NULL) ISNULL 첫 번째 널이 아닌 값을 선택한다 NULL 반환하므로 이어진다면 ISNULLNULL 인 경우 두 값이 같음을 나타냅니다 (NULL 또는 동일한 값).

0

여기에 대한 좋은 토론은 www.made2mentor.com입니다. 그는 모든 대안보다 더 나은 NULL을 다루기 때문에 EXCEPT를 사용할 것을 제안합니다. 스 니펫 :

WHEN MATCHED AND EXISTS 
    (SELECT Source.CustomerName, Source.Planet 
    EXCEPT 
    SELECT Target.CustomerName, Target.Planet)