Oracle - SCD Тип 2 - PullRequest
       145

Oracle - SCD Тип 2

0 голосов
/ 19 июня 2020

Я новичок в 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 Снабжающая компания, SUPPLIER_STATE = IL

В целевой таблице у меня уже есть данные SUPPLIER_KEY = 001 SUPPLIER_CODE = 001 SUPPLIER_NAME = Phlogistical Supply Company СОСТОЯНИЕ ПОСТАВЩИКА = CA START_DATE = 2000-01-01 END_DATE = 9999-12-31

Из этих таблиц есть отличия в столбце SUPPLIER_STATE. У меня есть задача обновить TARGET TABLE данными из SOURCE TABLE, используя SCD Type 2. Этот метод отслеживает исторические данные, создавая несколько записей. Также результат в столбцах start_date и end_date в целевой таблице должен использовать формат даты без времени (например, 2020-06-18). Как мне выполнить эту задачу, используя SQL MERGE или другой запрос на Oracle? Может ли кто-нибудь объяснить мне шаг за шагом с помощью Query? Вы можете увидеть изображение ниже, чтобы увидеть, как это выглядит.

Любая помощь будет принята с благодарностью.

Спасибо.

enter image description here

1 Ответ

1 голос
/ 19 июня 2020

Это должно соответствовать вашему варианту использования.

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')
                )
 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...