Oracle - MERGE关键字用法

发布时间 2023-06-27 09:38:45作者: 疯狂的妞妞

效果:查询两个结果集,根据其中一个,更新另一个。

在ETL项目中,掌握这个语句,就能完成大部分的数据处理了。

可能出现的问题:查询的结果集偏复杂,导致程序已经找不到结果集来自什么表(下列tar子句偏复杂)。
解决方式自然也简单,“目标结果集”尽量改成 SELECT * FROM TABLE 的格式。

MERGE INTO (
    -- 目标结果集,需要更新的结果集
    SELECT * FROM A_EVT_NOTICE_SMY WHERE DATA_DT = '20230101'
) TAR
USING (
    -- 源结果集,更新依据的结果集
    SELECT A.* 
    FROM A_CIF_CIFP_CUST_INFO_SMY A
    INNER JOIN A_EVT_NOTICE_SMY B 
    ON A.CUST_NO = B.CUST_NO 
    WHERE A.DATA_DT = '20230101'
) SRC
-- 匹配条件
ON (TAR.CUST_NO = SRC.CUST_NO)
WHEN MATCHED THEN
    -- do sth. when 命中
    UPDATE SET TAR.CUST_NO = SRC.CUST_NO, TAR.ID_CARD = SRC.ID_CARD
WHEN NOT MATCHED THEN
    -- do sth. when 未命中
    INSERT
        (DATA_DT, INST_NO, CUST_MGR, CUST_NO, ID_CARD)
    VALUES
        (SRC.DATA_DT, SRC.INST_NO, SRC.CUST_MGR, SRC.CUST_NO, SRC.ID_CARD);

-- 
COMMIT;