合并,不在源上时删除

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 joined 与源进行合并,但 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

【讨论】:

以上是关于合并,不在源上时删除的主要内容,如果未能解决你的问题,请参考以下文章

Git 分支的创建、切换、合并以及解决冲突、删除

《gitlab从零到壹》出现问题:代码合并,源分支会被删除解决方案

《gitlab从零到壹》出现问题:代码合并,源分支会被删除解决方案

Subversion 合并后树冲突 - “本地删除,合并时传入编辑”

SQL 合并错误:MERGE 语句试图更新或删除 [重复]

Python中可变数据的重复数据删除/合并