2016-11-24 2 views
0

こんにちは、良い一日。 2つのテーブルtable2table1で次のシーケンスを実行しようとしています。SQL - 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です。これは実行する必要があります。 私は、JOIN条件でtable1に別のレコードを挿入する2つのテーブルを比較するとき、それが原因でNULL <> NULLのUPDATEの代わりに挿入しようと、会って、これは私が持っているUNIQUE制約を起動した場合:

オブジェクト 'dbo.table2'に重複キーを挿入できません。

誰でもこの問題を解決できますか?

+0

正確にはどのフィールドに「NULL」を設定できますか? – gotqn

+0

'column5'、' column6'、 'column8' –

+0

' null'と 'null'をマッチさせると正しく動作しますか?((target.column5 = source.column5)OR(target.column5 IS NULLとsource.column5 IS NULL))AND'です。他の列についても同様です... – 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 2つの値が同じである場合(両方の値がnullの場合、またはNULL)、ISNULLは、最初の非ヌル値を選択するNULL戻りますので、結果場合ISNULLNULLであることは、2つの値が同じであること(両方ともNULLまたは同じ値)を意味します。

0

www.made2mentor.comに大きな議論があります。彼はEXCEPTを使うことを提案している。スニペット:

WHEN MATCHED AND EXISTS 
    (SELECT Source.CustomerName, Source.Planet 
    EXCEPT 
    SELECT Target.CustomerName, Target.Planet) 
関連する問題