SQL - 由于NULL列

时间:2016-11-24 06:57:30

标签: sql sql-server tsql sql-merge

大家好,祝大家好。 我试图在两个表table2table1上执行以下序列。

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中插入另一条记录,它会尝试INSERT而不是UPDATE,因为在比较两个表时NULL<> NULL因为我有以下UNIQUE约束而出现: / p>

  

无法在对象' dbo.table2'。

中插入重复的密钥

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分: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将返回NULLISNULL将选择第一个非空值(如果两个值都为空,则选择NULL),如果ISNULL的结果为NULL,表示两个值相同(NULL或相同的值)。

答案 1 :(得分:0)

www.made2mentor.com对此进行了很好的讨论。他建议使用EXCEPT,因为它比所有替代方案更好地处理NULL。片段:

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