合并,不在源上时删除
Posted
技术标签:
【中文标题】合并,不在源上时删除【英文标题】:Merge, delete when not on Source 【发布时间】:2018-10-10 15:52:39 【问题描述】:我在将合并语句合并到 FACT TABLE 时遇到问题
在用户开始从源中删除记录之前,这非常简单。
当前 SQL:
Set Count = 1
WHEN NOT MATCHED
INSERT
WHEN MATCHED
UPDATED
新 SQL:
所以在本例中,一条记录已从源中删除,它不再匹配但没有可插入的内容。我希望它的计数设置为 0。
WHEN DELETED FROM SOURCE
Set Count = 0
.
Source
Bob Jones | 1111
Mary Jones | 1112
James Jones | 1113
Helen Jones | 1114
TARGET
Bob Jones | 1111 | Count 1
Mary Jones | 1112| Count 1
James Jones | 1113| Count 1
Helen Jones | | 1114| Count 1
Peter Market | 1115| Count 0
我正在使用合并加载到事实表,现在它们只是一揽子删除记录,我的事实已关闭。这必须以某种方式解决?
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:您可以使用目标 full outer join
ed 与源进行合并,但 id
必须在两者之间使用唯一键才能工作。
MERGE INTO target tgt
USING (SELECT CASE
WHEN s.id IS NULL THEN t.name --write this logic for all other non id columns.
ELSE s.name
END AS name,
coalesce(s.id, t.id) AS id, --use target's id when no source id is available
CASE
WHEN s.id IS NULL THEN 0 --zero for non matching ids
ELSE 1
END AS source_count
FROM target t
full outer join source s
ON s.id = t.id) src
ON ( src.id=tgt.id)
WHEN matched THEN
UPDATE SET tgt.name = src.name,
tgt.source_count = src.source_count
WHEN NOT matched THEN
INSERT (id,
name,
source_count)
VALUES(src.id,
src.name,
1) ; --insert 1 by default for new rows
Demo
【讨论】:
以上是关于合并,不在源上时删除的主要内容,如果未能解决你的问题,请参考以下文章
《gitlab从零到壹》出现问题:代码合并,源分支会被删除解决方案
《gitlab从零到壹》出现问题:代码合并,源分支会被删除解决方案