PostgreSQL执行INSERT语句报column reference is ambiguous错误求解
问题原因
你的SQL出现列引用模糊报错,核心原因是GROUP BY子句中的created_at、updated_at字段存在两个同名来源,PostgreSQL无法判断要使用哪一个:
- 你在
SELECT列表中通过参数赋值,声明了别名为created_at、updated_at的字段 - 你关联的
restaurants表本身自带created_at、updated_at字段
修复方案
任选以下一种方式修改即可:
方案1:GROUP BY用字段位置序号引用
因为SELECT列表里除了关联查询的字段,其余都是固定参数或常量,直接按字段在SELECT中的位置序号分组,完全避免歧义:
-- 其余部分保持不变,仅修改GROUP BY子句 GROUP BY 1,2,3,4,6,7,8
序号对应SELECT列表的字段顺序:1=restaurant_drn_id、2=algorithm_name、3=city_drn_id、4=delivery_area、6=created_at、7=updated_at、8=delivery_area_type。
方案2:给参数赋值的时间字段设置独有别名
如果担心序号不好维护,可以把参数赋值的时间字段改成和表字段不重名的别名,GROUP BY直接使用该别名:
INSERT INTO delivery_areas SELECT r.drn_id AS restaurant_drn_id, 'initial'::algorithm_name AS algorithm_name, z.city_drn_id AS city_drn_id, ?::geometry AS delivery_area, gen_random_uuid() AS drn_id, ?::timestamp AS param_created_at, -- 修改别名避免和表字段重名 ?::timestamp AS param_updated_at, -- 修改别名避免和表字段重名 'custom'::delivery_area_type AS delivery_area_type FROM restaurants r JOIN neighborhood_zones nz ON (nz.hood_drn_id = r.hood_drn_id) JOIN zones z ON (z.drn_id = nz.zone_drn_id) WHERE r.drn_id = ? -- GROUP BY使用独有别名,不会出现歧义 GROUP BY restaurant_drn_id, algorithm_name, city_drn_id, delivery_area, param_created_at, param_updated_at, delivery_area_type ON CONFLICT ON CONSTRAINT delivery_areas_pkey DO UPDATE SET delivery_area = EXCLUDED.delivery_area, delivery_area_type = EXCLUDED.delivery_area_type, updated_at = EXCLUDED.updated_at RETURNING *
补充说明
你当前的查询已经通过WHERE r.drn_id = ?限定了单个门店的查询范围,关联后的结果集里restaurant_drn_id是唯一值,其余分组字段都是固定常量,分组逻辑本身不会产生冗余结果,两种修改方式都可以正常运行。
内容的提问来源于stack exchange,提问作者William Rose
相关产品推荐
相关产品推荐

