我在尝试为子查询提供别名然后在Where子句中引用它时收到错误消息:未知列' point_status'在' where子句'
SELECT goals.id, goals.status,
ifnull((SELECT point_status FROM pts WHERE point_id = ?), goals.status) as point_status
FROM goals
WHERE goals.name = ? AND point_status > 1
我不明白为什么它不允许我使用这个别名。是否可以通过不修改Query的功能以某种方式在where子句中使用该别名?
答案 0 :(得分:4)
您不能在同一个select语句Alias name
子句中使用where
。您可以将其设为Sub-select
并使用alias name
中的outer query
来过滤记录。
select * from
(SELECT goals.id, goals.status,
ifnull((SELECT point_status FROM pts WHERE point_id = ?), goals.status) as point_status
FROM goals
WHERE goals.name = ?)a
where point_status>1
答案 1 :(得分:2)
不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值。
这意味着您不能在where
子句中使用别名。
尝试将where
替换为having
。
答案 2 :(得分:1)
您可以使用子查询,或者您可以执行以下操作(如果使用子查询不方便):
SELECT goals.id, goals.status
, IFNULL((SELECT point_status FROM pts WHERE point_id = ?), goals.status) AS point_status
FROM goals
WHERE goals.name = ?
AND IFNULL((SELECT point_status FROM pts WHERE point_id = ?), goals.status) > 1
答案 3 :(得分:0)
其他可能的解决方案:
CREATE VIEW vw_myView
AS
SELECT goals.id, goals.status,
ifnull((SELECT point_status FROM pts WHERE point_id = ?), goals.status) as point_status
FROM goals
然后:
SELECT * from vw_MyView WHERE goals.name = ? AND point_status > 1