PostgreSQL中如何在UPSERT的EXCLUDED里引用表别名?
PostgreSQL UPSERT语句错误修复:无法引用表别名"b"
你的错误源于对PostgreSQL UPSERT中EXCLUDED虚拟表的用法误解,以及不必要的别名误用。
核心问题
EXCLUDED是PostgreSQL专门用来指代冲突时原本要插入的那一行数据的虚拟表,它和目标表的别名b是完全独立的两个实体,不能用excluded.b.字段名这种方式访问它的字段。另外,ON CONFLICT DO UPDATE的SET子句上下文默认指向目标表,目标字段加不加别名b都可以,但加了也不会出错——真正触发错误的是EXCLUDED后面的b。
修正后的SQL语句
INSERT INTO tbl_acc_payable_balances AS b ("supplierId", total, "balanceNotdue", "createdBy") SELECT r."supplierId", po.total, po.total, r."updatedBy" FROM tbl_wh_receptions r, tbl_sh_purchase_orders po WHERE r."xmlUploaded" = 1 AND r."completedMaterial" = 1 AND r."purchaseOrderId" = po.id AND r."updatedAt" = (SELECT MAX("updatedAt") FROM tbl_wh_receptions) ON CONFLICT ("supplierId") DO UPDATE SET total = b.total + EXCLUDED.total, "balanceNotdue" = b."balanceNotdue" + EXCLUDED."balanceNotdue";
修改点说明
- 把
excluded.b.total改成EXCLUDED.total,excluded.b."balanceNotdue"改成EXCLUDED."balanceNotdue"——直接通过EXCLUDED访问待插入行的字段即可,不需要附加目标表的别名。 - 目标字段的
b.total和b."balanceNotdue"可以保留,也可以直接写成total和"balanceNotdue",两种写法都合法,不影响执行结果。
内容的提问来源于stack exchange,提问作者Felipe Renovato
相关产品推荐
相关产品推荐

