在这个关于连接三个不同表的动作练习中,答案如下:
select mems.firstname || ' ' || mems.surname as member,
facs.name as facility,
case
when mems.memid = 0 then
bks.slots*facs.guestcost
else
bks.slots*facs.membercost
end as cost
from
cd.members mems
inner join cd.bookings bks
on mems.memid = bks.memid
inner join cd.facilities facs
on bks.facid = facs.facid
where
bks.starttime >= '2012-09-14' and
bks.starttime < '2012-09-15' and (
(mems.memid = 0 and bks.slots*facs.guestcost > 30) or
(mems.memid != 0 and bks.slots*facs.membercost > 30)
)
order by cost desc;为什么我不能引用cost子句中的SELECT列表中的WHERE别名?
如果我在以下方面运行相同的查询:
...
where
bks.starttime >= '2012-09-14' and
bks.starttime < '2012-09-15' and
cost > 30
order by cost desc;发生错误:
错误:列“成本”不存在
从这个答案我可以清楚地看到,这是因为评估的顺序。但是为什么允许order by cost desc;呢?
发布于 2016-06-26 20:40:04
你问两个问题:
1.
为什么我不能引用WHERE子句中的SELECT成本别名?
2.
但为什么允许按成本订货?
The 手册在这里给出了这两种方法的答案:
输出列的名称可以用于引用
ORDER BY和GROUP BY子句中的列的值,但不能引用WHERE或HAVING子句中的列;必须在那里写出表达式。
它是由SQL标准定义的,原因是SELECT查询中的事件序列。在应用WHERE子句时,尚未计算SELECT列表中的输出列。但是当涉及到ORDER BY时,输出列是现成的。
因此,虽然这在一开始是不方便和令人困惑的,但它还是有意义的。
相关信息:
https://stackoverflow.com/questions/38040631
复制相似问题