效果:查询两个结果集,根据其中一个,更新另一个。
在ETL项目中,掌握这个语句,就能完成大部分的数据处理了。
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;
实际操作之后,可能会遇到的问题:
WHEN MATCHED 执行 UPDATE 语句的时候,执行失败,
可能是目标结果集偏复杂(上面的 tar 子句),导致程序找不到结果集来自什么表。
解决方式自然也简单,“目标结果集” 尽可能改成 SELECT * FROM TABLE 的格式。