You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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";

修改点说明

  1. 把excluded.b.total改成EXCLUDED.total,excluded.b."balanceNotdue"改成EXCLUDED."balanceNotdue"——直接通过EXCLUDED访问待插入行的字段即可,不需要附加目标表的别名。
  2. 目标字段的b.total和b."balanceNotdue"可以保留,也可以直接写成total和"balanceNotdue",两种写法都合法,不影响执行结果。

内容的提问来源于stack exchange,提问作者Felipe Renovato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:30:16