oracle-scd类型2

eqoofvh9  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(359)

我是甲骨文的新手。
我有两张table叫。 dwh_tbl_dim_supplier_type2_ar (目标表) stg_tbl_dim_supplier_ar (源表) dwh_tbl_dim_supplier_type2_ar 包含六列

SUPPLIER_KEY (PK)
SUPPLIER_CODE
SUPPLIER_NAME
SUPPLIER_STATE
START_DATE
END_DATE
``` `stg_tbl_dim_supplier_ar` 包含三列

SUPPLIER_KEY (PK)
SUPPLIER_NAME
SUPPLIER_STATE

在source表中,我已经有一个记录supplier\u key=001,supplier\u name=phlogistical supply company,supplier\u state=il
在目标表中,我已经有一个数据supplier\u key=001 supplier\u code=001 supplier\u name=phlogistical supply company supplier state=ca start\u date=2000-01-01 end\u date=9999-12-31
从这些表中可以看出,supplier\u state列中存在差异。我的任务是使用scd类型2用源表中的数据更新目标表。此方法通过创建多个记录来跟踪历史数据。另外,目标表的“开始日期”和“结束日期”列中的结果必须使用不带时间的日期格式(例如:2020-06-18)。如何使用sql合并或oracle上的其他查询执行此任务?有人能用疑问一步一步地给我解释一下吗?你可以看到下面的图片,看看它看起来像什么。
任何帮助都将不胜感激。
谢谢。
![](https://i.stack.imgur.com/som6G.png)
yduiuuwa

yduiuuwa1#

这应该适合您的用例。

MERGE INTO dwh_tbl_dim_supplier_type2_ar DIM
   USING (SELECT 
          A.SUPPLIER_KEY, 
          B.SUPPLIER_CODE,
          A.SUPPLIER_NAME, 
          A.SUPPLIER_STATE
          FROM stg_tbl_dim_supplier_ar A
          LEFT JOIN (SELECT DISTINCT SUPPLIER_CODE, SUPPLIER_KEY FROM dwh_tbl_dim_supplier_type2_ar) B
          ON A.SUPPLIER_KEY = B.SUPPLIER_KEY
         ) STG
    ON DIM.SUPPLIER_KEY = STG.SUPPLIER_KEY
    AND DIM.SUPPLIER_NAME = STG.SUPPLIER_NAME
    AND DIM.SUPPLIER_STATE = STG.SUPPLIER_STATE
   WHEN MATCHED THEN UPDATE SET DIM.END_DATE = TO_DATE(SYSDATE,'DD/MM/YYYY') 
   WHEN NOT MATCHED THEN 
        INSERT (DIM.SUPPLIER_KEY,
                DIM.SUPPLIER_CODE,
                DIM.SUPPLIER_NAME,
                DIM.SUPPLIER_STATE,
                DIM.START_DATE,
                DIM.END_DATE
                )
        VALUES (STG.SUPPLIER_KEY,
                STG.SUPPLIER_CODE,
                STG.SUPPLIER_NAME,
                STG.SUPPLIER_STATE,
                TO_DATE(SYSDATE,'DD/MM/YYYY'),
                TO_DATE('31/12/9999','DD/MM/YYYY')
                )
 ;

相关问题