【问题标题】:How to use the AS name in a query WHERE clause?如何在查询 WHERE 子句中使用 AS 名称?
【发布时间】:2013-01-29 15:57:31
【问题描述】:
给定这样的查询:
SELECT
id,
(SELECT COUNT(*)
FROM members
WHERE members.network_id = networks.id) AS mem_count
FROM
networks
WHERE mem_count > 2
使用此查询,where 子句会中断,因为它不知道 mem_count 是什么...为什么我不能在 where 子句中使用 as var?
谢谢
【问题讨论】:
标签:
postgresql
postgresql-9.1
【解决方案1】:
你已经理解了这个概念。你只需要正确的语法。您可以像这样重写并获得使查询符合 ANSI 的额外好处:
SELECT
id,
m.mem_count
FROM
networks n
JOIN (
SELECT m.network_id,
COUNT(*) AS mem_count
FROM members
GROUP BY m.network_id
) m
ON m.network_id = n.id
AND m.mem_count > 2;
【解决方案2】:
试试:
SELECT
id,
(SELECT COUNT(*) as mem_count
FROM members
WHERE members.network_id = networks.id)
FROM
networks
WHERE mem_count > 2
【解决方案3】:
一种方法是。
Select * From (
SELECT
id,
(SELECT COUNT(*)
FROM members
WHERE members.network_id = networks.id) AS mem_count
FROM
networks)) mem_counts
WHERE mem_count > 2
不过,按照伯尼的建议加入会更好。基本上你混淆了解析器。当您使用 AS 为列名设置别名时,您会遇到与 group by 或 order by 相同的问题。
【解决方案4】:
虽然 bernie 建议问题的正确答案,但您的查询可以简化为:
SELECT
network_id as id,
count(*)
FROM
members
GROUP BY
network_id
HAVING
count(*) > 2
作为额外的奖励,它可以更快。