如何通过CONTACT表更新ROLES表,将重复联系人ID替换为组内最小ID?
问题解决方法
错误原因
原有MERGE语句的关联条件T1.ROWID = T2.ROWID不成立:ROWID是单表内的行唯一标识,ROLES表和CONTACT表的ROWID没有对应关系,因此没有匹配到任何行,返回0行合并。
正确实现
你需要先为CONTACT表的每一条记录生成对应分组的最小CONTACT_ID映射,再通过CONTACT_ID关联ROLES表执行更新:
修正后的MERGE语句
MERGE INTO ROLES T1 USING( SELECT CONTACT_ID, MIN(CONTACT_ID) OVER (PARTITION BY FIRST_NAME, LAST_NAME, PHONE) AS min_contact_id FROM CONTACT ) T2 ON (T1.CONTACT_ID = T2.CONTACT_ID) WHEN MATCHED THEN UPDATE SET T1.CONTACT_ID = T2.min_contact_id;
兼容更多数据库的UPDATE写法
如果你的数据库不支持上述MERGE写法,也可以用通用UPDATE语句实现:
UPDATE ROLES r SET CONTACT_ID = ( SELECT MIN(c2.CONTACT_ID) FROM CONTACT c1 JOIN CONTACT c2 ON c1.FIRST_NAME = c2.FIRST_NAME AND c1.LAST_NAME = c2.LAST_NAME AND c1.PHONE = c2.PHONE WHERE c1.CONTACT_ID = r.CONTACT_ID )
注意事项
- 如果ROLES表的CONTACT_ID字段存在外键关联约束,更新前需要暂时禁用约束,更新完成后再重新启用,避免触发外键校验报错。
内容的提问来源于stack exchange,提问作者Saafi
相关产品推荐
相关产品推荐

