合并,不在源时删除

时间:2018-10-10 15:52:39

标签: sql oracle data-warehouse sql-merge fact

我对合并到事实表的合并语句有疑问

这非常简单,直到用户开始从源中删除记录。

当前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 个答案:

答案 0 :(得分:0)

您可以使用带有源代码的目标full outer join进行合并,但是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