我有一个表,我想使用T-SQL Merge statement
为其创建SCD Type 2
,但它没有唯一键。
RoleTaskTable:
RoleID, TaskID
1,A
1,B
1,C
2,A
2,D
2,F
3,A
3,B
3,E
3,F
显然我得到了错误
"The MERGE statement attempted to UPDATE or DELETE the same row more than once. This happens when a target row matches more than one source row. A MERGE statement cannot UPDATE/DELETE the same row of the target table multiple times. Refine the ON clause to ensure a target row matches at most one source row, or use the GROUP BY clause to group the source rows."
当我将RoleID
和TaskID
组合为临时表和 SCDTable 的唯一索引时,它会将其简单地识别为新记录,因此所有记录(即使删除了一些记录(在 SCD 表中保持标记为活动。
你怎么能解决这样的事情?
我可以显示我为此 SCD 编写的整个代码,但我认为我在这里错过了一些基本的东西。
A 听起来很明显的风险,给表一个唯一的键。 没有一个,它就不是一个适当的关系。 合并旨在处理工作唯一键。
OTOH,由于 Merge 只是插入/更新/删除的一站式商店,您可以使用包装在事务中的单个命令来完成同样的事情。