甲骨文 - SCD 类型 2

Posted

技术标签:

【中文标题】甲骨文 - SCD 类型 2【英文标题】:Oracle - SCD Type 2 【发布时间】:2020-06-19 07:27:06 【问题描述】:

我是 Oracle 新手。

我有 2 个表被调用。

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

在源表中我已经有一条记录 SUPPLIER_KEY = 001, SUPPLIER_NAME = Phlogistical Supply Company, SUPPLIER_STATE = IL

在目标表中我已经有一个数据 SUPPLIER_KEY = 001 SUPPLIER_CODE = 001 SUPPLIER_NAME = Phlogistical Supply Company SUPPLIER STATE = CA START_DATE = 2000-01-01 END_DATE = 9999-12-31

从这些表中,SUPPLIER_STATE 列存在差异。我的任务是使用 SCD 类型 2 使用 SOURCE TABLE 中的数据更新 TARGET TABLE。此方法通过创建多个记录来跟踪历史数据。此外,目标表的 start_date 和 end_date 列中的结果必须使用不带时间的日期格式(例如:2020-06-18)如何使用 SQL MERGE 或 Oracle 上的其他查询执行此任务?谁能用 Query 一步一步地解释我?您可以查看下图以了解它的外观。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

这应该适合您的用例。

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')
                )
 ;

【讨论】:

以上是关于甲骨文 - SCD 类型 2的主要内容,如果未能解决你的问题,请参考以下文章

用oracle查询表字段的的数据类型怎么查?

甲骨文写日文字符

Oracle是啥?

甲骨文是不是面临千年虫问题? [关闭]

ORA-01722: 无效编号 当我尝试执行存储过程时。甲骨文错误

您可以将 (2) 参数传递给 UNPIVOT 的 FOR 子句吗? - 甲骨文SQL