我正在SQL Server中执行合并。在我的更新中,我只想在值变更时更新数据列。每次更新时,都会有一个版本数据列递增。下面是范例:
MERGE Employee as tgt USING
(SELECT Employee_History.Emp_ID
, Employee_History.First_Name
, Employee_History.Last_Name
FROM Employee_History)
as src (Emp_ID,First_Name,Last_Name)
ON tgt.Emp_ID = src.Emp_ID
WHEN MATCHED THEN
UPDATE SET
Emp_ID = src.Emp_ID,
,[VERSION] = tgt.VERSION + 1
,First_Name = src.First_Name
,Last_Name = src.Last_Name
WHEN NOT MATCHED BY target THEN
INSERT (Emp_ID,0,First_Name,Last_Name)
VALUES
(src.Emp_ID,[VERSION],src.First_Name,src.Last_Name);
现在,如果我只想更新行,并因此增加版本,只有当名称已更改。
4条答案
按热度按时间qni6mghb1#
WHEN MATCHED
可以有AND
。而且,不需要更新EMP_ID
。如果Last_Name或First_Name可以为空,则在比较trg.Last_Name〈〉src.Last_Name时需要注意
NULL
值,例如ISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'')
mcvgt66p2#
a1ex07提供的答案是正确的,但我只是想详细说明比较大量列、查看空值等方面的困难。
我发现我可以使用哈希字节在某些CTE中生成校验和,将这些CTE作为合并的目标,然后使用上面指定的“update and....”条件来比较哈希:
注意事项:我本可以用校验和或binary_checksum来大大简化,但我总是会遇到冲突。
至于“为什么”,这是自动部署的一部分,以保持查找表最新。但合并的问题是,有一个复杂的索引视图,大量使用,所以更新相关表是相当昂贵的。
cdmah0mi3#
您可以更改
[VERSION] + 1
代码,在名称匹配时添加零,而不是完全避免更新:b91juud34#
@a1ex07感谢您的回答..稍有更正..我没有遵循SQL版本,因此这可能是SQL规范中的更改
当匹配和条件时,则更新
上述语法无效
以下内容有效
如果匹配,则更新集合...WHERE条件如果不匹配,则插入...
因此将其更改为
WHERE目标名〈〉源名OR目标姓〈〉源姓
https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606