oracle - merge语法
这是处理数据,必须掌握的语句之一,学会这个,就能处理大部分的需求了。
效果:有两个查询结果,根据其中一个,更新另一个。
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;
实际操作之后,可能会遇到的问题:
- 把查询写得很复杂(目标结果集),程序无法判断查询结果来自什么表。
这会导致语句执行失败,尽可能改成 SELECT * FROM TABLE 的格式。
- 产生一对多关联时,无法 MERGE,需要对多余的数据进行清理或者去重
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!