如何在oracle中使用merge命令

yjghlzjz  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(265)

我有如下的查询操作。如果dwb\u acct\u clss\u stg2是stage table,dwb\u acct\u class是target table,如何编写单个合并查询?

INSERT INTO DWB_ACCT_CLSS_STG2
SELECT
STG1.ACCT_CLSS_CD
,STG1.ACCT_CLSS_NME
,STG1.ACCT_CLSS_DSC 
,STG1.PROCESS_NAME
,STG1.EXECUTION_ID
,STG1.FILE_ID
,STG1.FILE_DATE
,STG1.DATA_DATE
,STG1.LOAD_USER
,STG1.LOAD_DATE
,STG1.DW_LAST_UPDATE_TIME
FROM DWB_ACCT_CLSS_STG1 STG1
LEFT OUTER JOIN DWB_ACCT_CLASS TRGT
ON STG1.ACCT_TYP_CD = TRGT.ACCT_TYP_CD
WHERE TRGT.ACCT_TYP_CD IS NULL;

INSERT INTO DWB_ACCT_TYP_STG2
SELECT
STG1.ACCT_TYP_CD
,STG1.ACCT_TYP_DSC
,STG1.PROCESS_NAME
,STG1.EXECUTION_ID
,STG1.FILE_ID
,STG1.FILE_DATE
,STG1.DATA_DATE
,STG1.LOAD_USER
,STG1.LOAD_DATE
,STG1.DW_LAST_UPDATE_TIME
FROM DWB_ACCT_CLASS_STG1 STG1
INNER JOIN DWB_ACCT_CLASS TRGT
ON STG1.ACCT_TYP_CD = TRGT.ACCT_TYP_CD
WHERE (
STG1.ACCT_TYP_DSC <> TRGT.ACCT_TYP_DSC
);

DELETE FROM DWB_ACCT_class WHERE (ACCT_TYP_CD) IN (SELECT ACCT_TYP_CD FROM DWB_ACCT_CLASS_STG2 STG2);

INSERT INTO DWB_ACCT_CLASS SELECT * FROM DWB_ACCT_CLASS_STG2;
qyswt5oh

qyswt5oh1#

我想你甚至不需要手术台 DWB_ACCT_CLSS_STG2 . 您可以使用以下方法 MERGE 命令:

MERGE INTO DWB_ACCT_CLASS TRGT
USING (SELECT STG1.ACCT_CLSS_CD,
           STG1.ACCT_CLSS_NME,
           STG1.ACCT_CLSS_DSC,
           STG1.PROCESS_NAME,
           STG1.EXECUTION_ID,
           STG1.FILE_ID,
           STG1.FILE_DATE,
           STG1.DATA_DATE,
           STG1.LOAD_USER,
           STG1.LOAD_DATE,
           STG1.DW_LAST_UPDATE_TIME
      FROM DWB_ACCT_CLSS_STG1   STG1) STG1
ON (STG1.ACCT_TYP_CD = TRGT.ACCT_TYP_CD 
    AND STG1.ACCT_TYP_DSC <> TRGT.ACCT_TYP_DSC)
WHEN MATCHED THEN
UPDATE SET TRGT.ACCT_CLSS_CD = STG1.ACCT_CLSS_CD, ..... -- EXCEPT ACCT_TYP_CD AND ACCT_TYP_DSC COLUMN
WHEN NOT MATCHED THEN 
INSERT (... COLUMNS OF THE DWB_ACCT_CLASS TABLE ....)
VALUES (STG1.ACCT_CLSS_CD,STG1.ACCT_CLSS_NME,.....STG1.DW_LAST_UPDATE_TIME)  -- ORDER MUST MATCH WITH THE INSERT CLASUE COLUMN LIST

相关问题