PostgreSQL使用COALESCE函数更新表报relation "a"不存在错误
错误排查
你遇到的relation "a" does not exist报错来自PostgreSQL语法规则不匹配:
PostgreSQL的UPDATE ... FROM语法要求,UPDATE关键字后必须直接指定要更新的实体表名,别名需要跟随在表名后定义。你原代码第一行直接写UPDATE A时,数据库还未解析到后续FROM "House" A的别名声明,无法识别名为A的关系对象,因此直接抛出错误。
除此之外原SQL还有三处逻辑隐患:
- 自连接时未过滤B表的空地址记录,可能匹配到同PARCELID下同样地址为空的无效记录,产生无意义的join开销
- 多余的
COALESCE函数:WHERE条件已经限定A表的PROPERTYADDRESS为NULL,函数永远返回B表的地址值,属于冗余写法 - 未对多匹配场景做限制,如果同PARCELID下存在多条不同非空地址的记录,可能导致更新结果不确定,建议更新前先校验匹配关系。
修正后代码
先执行校验查询,确认待补全的地址匹配关系正确:
SELECT A.UNIQUEID, A.PARCELID, A.PROPERTYADDRESS AS original_empty_addr, B.PROPERTYADDRESS AS matched_fill_addr FROM "House" A JOIN "House" B ON A.PARCELID = B.PARCELID AND A.UNIQUEID != B.UNIQUEID WHERE A.PROPERTYADDRESS IS NULL AND B.PROPERTYADDRESS IS NOT NULL;
确认匹配结果无误后,执行更新语句:
UPDATE "House" A SET PROPERTYADDRESS = B.PROPERTYADDRESS FROM "House" B WHERE A.PARCELID = B.PARCELID AND A.UNIQUEID != B.UNIQUEID AND A.PROPERTYADDRESS IS NULL AND B.PROPERTYADDRESS IS NOT NULL;
内容的提问来源于stack exchange,提问作者Harish
相关产品推荐
相关产品推荐

