SQL使用SELECT语句新增数值列时别名无法被后续运算引用问题
问题根源
SQL的逻辑执行顺序决定了同层级SELECT子句中定义的列别名,无法被同层级SELECT里的后续表达式直接引用,所以你原来的写法会报Units字段不存在的错误。
解决方案
下面是3种符合要求的实现方式,都不需要直接把Units替换成12:
方案1:嵌套子查询(全数据库兼容)
先在内层子查询中定义好Units常量,外层查询引用这个别名完成后续计算:
SELECT FullTimeCost, PerUnitCost, Units, PerUnitCost * Units AS TotalPerUnitCost, FullTimeCost + TotalPerUnitCost AS TotalTuition FROM ( SELECT FullTimeCost, PerUnitCost, 12 AS Units FROM Tuition ) AS t
方案2:CTE(公共表表达式,MySQL 8.0+/PostgreSQL/SQL Server等主流新版本数据库兼容)
逻辑和子查询一致,代码可读性更高:
WITH tuition_with_units AS ( SELECT FullTimeCost, PerUnitCost, 12 AS Units FROM Tuition ) SELECT FullTimeCost, PerUnitCost, Units, PerUnitCost * Units AS TotalPerUnitCost, FullTimeCost + TotalPerUnitCost AS TotalTuition FROM tuition_with_units
方案3:LATERAL JOIN定义常量(兼容PostgreSQL/MySQL 8.0+/SQL Server)
可以在同层查询中通过CROSS JOIN提前定义可复用的别名:
SELECT FullTimeCost, PerUnitCost, v.Units, PerUnitCost * v.Units AS TotalPerUnitCost, FullTimeCost + TotalPerUnitCost AS TotalTuition FROM Tuition CROSS JOIN (SELECT 12 AS Units) AS v
内容的提问来源于stack exchange,提问作者KyleC
相关产品推荐
相关产品推荐

