sql-server - 使用 MERGE 语句更新 SCD2
问题描述
我想使用MERGE
语句更新 SCD-2 表。所以我有:
MERGE TARGET as t
USING SOURCE as s
ON s.KEY = t.KEY
情况1:
WHEN MATCHED and s.CHECKSUM <> t.CHECKSUM
在这种情况下,我希望TARGET 中的第一行 和SOURCE 中的第二行到 TARGETUPDATE
set row_actual_to = getdate()
INSERT
案例二:
WHEN NOT MATCHED
只是INSERT
新行
如何在一个声明中做到这一点?
在案例 1UPDATE
中列出两者都会导致错误:MERGE 语句必须以分号 (;) 终止。INSERT
解决方案
不要使用合并语句。Merge 语句有一长串“无法修复”的错误,这些错误可能会在某些情况下损坏您的数据。
使用更新语句,插入语句更简单,更容易调试,并且比合并阶段执行得更好
https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/
https://sqlperformance.com/2013/02/t-sql-queries/another-merge-bug
推荐阅读
- jquery - Wordpress wp_enqueue_script() 和页脚中的 jQuery
- android - 如何处理 React Native 底部选项卡中的后退按钮行为?
- sql - 我们可以从分区中删除一些行而不是循环遍历大表的所有记录吗?
- python - 将 Python dict 转换为类 __init__ **kwargs?
- java - 第一个定制问题——努力寻找约束
- python - 在python中打印下标| X_{一些文字}
- swift - Swiftui 在 TextField 中输入值,然后单击按钮需要更改文本 - 不起作用
- html - 在 iPhone 上显示单选按钮时出现奇怪的线条
- javascript - Angular js,未在表中显示套接字数据(ng-repeat)
- django - Django 使用 get_or_create() 方法创建但不更新对象