SQL - 由于 NULL 列,合并尝试插入而不是更新
SQL - Merge trying to INSERT instead of UPDATE because of NULL columns
大家好,美好的一天。
我正在尝试在两个表 table2
和 table1
.
上执行以下序列
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
中插入另一条记录,它会尝试插入而不是更新,因为在比较两个表时为 NULL<>NULL,这是由于我具有的 UNIQUE 约束而出现的:
Cannot insert duplicate key in object 'dbo.table2'.
谁能帮我解决这个问题?
一种方法:
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
将 return NULL
,ISNULL
将 select 第一个非空值(或 NULL
如果两个值都为空)所以如果 ISNULL
的结果是 NULL
这意味着两个值相同(都是 NULL
或相同的值)。
www.made2mentor.com 对此进行了很好的讨论。他建议使用 EXCEPT,因为它比所有替代方法都能更好地处理 NULL。片段:
WHEN MATCHED AND EXISTS
(SELECT Source.CustomerName, Source.Planet
EXCEPT
SELECT Target.CustomerName, Target.Planet)
大家好,美好的一天。
我正在尝试在两个表 table2
和 table1
.
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
中插入另一条记录,它会尝试插入而不是更新,因为在比较两个表时为 NULL<>NULL,这是由于我具有的 UNIQUE 约束而出现的:
Cannot insert duplicate key in object 'dbo.table2'.
谁能帮我解决这个问题?
一种方法:
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
将 return NULL
,ISNULL
将 select 第一个非空值(或 NULL
如果两个值都为空)所以如果 ISNULL
的结果是 NULL
这意味着两个值相同(都是 NULL
或相同的值)。
www.made2mentor.com 对此进行了很好的讨论。他建议使用 EXCEPT,因为它比所有替代方法都能更好地处理 NULL。片段:
WHEN MATCHED AND EXISTS
(SELECT Source.CustomerName, Source.Planet
EXCEPT
SELECT Target.CustomerName, Target.Planet)