SQLite查询同层SELECT引用列别名求和报无此列错误问题
报错根因
同层级SELECT子句中定义的列别名,无法在同一层SELECT的其他计算表达式里直接引用。SQL的执行逻辑中,SELECT子句的别名是在所有SELECT列的计算逻辑执行完成后才会生成,你写的(fee + subtotal) as total在执行时,fee和subtotal两个别名还未创建,因此抛出no such column: fee错误。
额外存在的字段不匹配问题
对照你提供的建表语句,原SQL还有几处字段名写错的问题,就算解决别名问题也会报字段不存在错误:
- persons、services表存储名称的字段是
name,不是nombre - fees、obligations表关联人员的字段是
person_id,不是user_id - fees表存储额外费用金额的字段是
amount,不是value - 请确认
active字段的取值定义:如果1代表启用/激活,原SQL中所有active=0的筛选条件会取到停用状态的数据,和业务需求不符,需要调整为active=1
解决方案
推荐使用子查询嵌套的方式实现,先在内层查询算出fee和subtotal,外层再计算总金额,这种写法只需要传一次subtotal参数,适配你在Golang中预计算小计传参的场景,修正后的SQL如下:
SELECT person, service, fee, subtotal, (fee + subtotal) AS total FROM ( SELECT P.name AS person, S.name AS service, ( SELECT TOTAL(C.amount) FROM fees C WHERE C.person_id = P.id AND C.service_id = O.service_id AND C.active = 1 -- 请根据实际active取值规则调整,确保取的是激活状态的额外费用 ) AS fee, ? AS subtotal -- 直接使用参数占位符即可,无需硬编码23333 FROM receipts R LEFT JOIN obligations O ON O.service_id = R.service_id LEFT JOIN persons P ON O.person_id = P.id LEFT JOIN services S ON O.service_id = S.id WHERE R.id = 3 AND O.active = 1 -- 同样根据active取值规则调整,确保取的是需要承担费用的生效关联关系 ) res
如果你不想用嵌套子查询,也可以在计算total时重复写fee的子查询逻辑和subtotal参数,但这种写法需要重复传入一次subtotal参数,容易出错,示例如下:
SELECT P.name AS person, S.name AS service, ( SELECT TOTAL(C.amount) FROM fees C WHERE C.person_id = P.id AND C.service_id = O.service_id AND C.active = 1 ) AS fee, ? AS subtotal, ( ( SELECT TOTAL(C.amount) FROM fees C WHERE C.person_id = P.id AND C.service_id = O.service_id AND C.active = 1 ) + ? ) as total FROM receipts R LEFT JOIN obligations O ON O.service_id = R.service_id LEFT JOIN persons P ON O.person_id = P.id LEFT JOIN services S ON O.service_id = S.id WHERE R.id = 3 AND O.active = 1;
内容的提问来源于stack exchange,提问作者mlc
相关产品推荐
相关产品推荐

