从LEGACY_CUST_INFO更新CUST_INFO表NULL列失败,求正确SQL实现
解决CUST_INFO表中NULL特权编号从LEGACY_CUST_INFO更新的问题
需要将CUST_INFO表中CUST_PRIVILEGE_NUMBER为NULL的记录,通过ROW_ID与LEGACY_CUST_INFO表精确匹配,获取正确值更新,同时设置UPDATED为当前系统时间、UPDATED_BY为'ADMIN'。
两张表的结构及数据如下:
LEGACY_CUST_INFO表数据
ROW_ID CUST_PRIVILEGE_NUMBER UPDATED UPDATED_BY 1-AB 2345 16-JUN-2022 ADMIN 1-AC 3345 17-JUN-2022 ADMIN 1-AV 2335 20-JUN-2022 ADMIN 1-AN 2042 18-JUN-2022 ADMIN 1-AG 2255 01-JUN-2022 ADMIN
CUST_INFO表数据
ROW_ID CUST_PRIVILEGE_NUMBER UPDATED UPDATED_BY 1-AB NULL 22-JUN-2022 ADMIN 1-AC NULL 22-JUN-2022 ADMIN 1-AV 5409 22-JUN-2022 ADMIN 1-AN NULL 22-JUN-2022 ADMIN 1-AG 8848 22-JUN-2022 ADMIN
原MERGE语句失效原因
原语句中使用ci.cust_privilege_number != lci.cust_privilege_number作为筛选条件,但SQL中NULL值与任何值的比较结果都是UNKNOWN,不会被纳入查询结果,导致源数据集为空,MERGE无法执行更新操作。
正确的MERGE语句写法
调整源查询的筛选条件,明确匹配CUST_INFO中CUST_PRIVILEGE_NUMBER为NULL的行:
MERGE INTO cust_info dst USING ( SELECT lci.row_id, lci.cust_privilege_number FROM legacy_cust_info lci INNER JOIN cust_info ci ON ci.row_id = lci.row_id WHERE ci.cust_privilege_number IS NULL ) src ON (dst.row_id = src.row_id) WHEN MATCHED THEN UPDATE SET dst.cust_privilege_number = src.cust_privilege_number, dst.updated = SYSDATE, dst.updated_by = 'ADMIN';
备选方案:使用UPDATE语句
如果更倾向于使用UPDATE而非MERGE,也可以采用以下写法:
UPDATE cust_info dst SET cust_privilege_number = ( SELECT lci.cust_privilege_number FROM legacy_cust_info lci WHERE lci.row_id = dst.row_id ), updated = SYSDATE, updated_by = 'ADMIN' WHERE dst.cust_privilege_number IS NULL AND EXISTS ( SELECT 1 FROM legacy_cust_info lci WHERE lci.row_id = dst.row_id );
添加EXISTS条件是为了避免更新那些在LEGACY_CUST_INFO中无匹配ROW_ID的行(若存在此类数据)。
内容的提问来源于stack exchange,提问作者Cool_Oracle
相关产品推荐
相关产品推荐

