Postgresql 如何在查询WHERE子句中使用AS名称?

Postgresql 如何在查询WHERE子句中使用AS名称?,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,给出这样一个查询: 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 谢谢你已经记下了这个概念。您只需要正确的语法。您可以这样重

给出这样一个查询:

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


谢谢

你已经记下了这个概念。您只需要正确的语法。您可以这样重新编写,并且还可以使查询符合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;

你已经记下了这个概念。您只需要正确的语法。您可以这样重新编写,并且还可以使查询符合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;
尝试:

尝试:

一种方法是

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也会遇到同样的问题。

一种方法是

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也会遇到同样的问题。

虽然bernie建议正确答案,但您的查询可以简化为:

SELECT
  network_id as id,
  count(*)
FROM
  members
GROUP BY
  network_id 
HAVING
  count(*) > 2

作为额外的奖励,它可以更快。

伯尼对问题提出了正确的答案,您的查询可以简化为:

SELECT
  network_id as id,
  count(*)
FROM
  members
GROUP BY
  network_id 
HAVING
  count(*) > 2

作为额外的奖励,它可以更快。

此查询假设您需要更多来自
网络
表的值,而不仅仅是
id
。如果不是这样,请使用depesz的答案:此查询假设您需要更多来自
网络
表的值,而不仅仅是
id
。如果不是这样,请使用depesz的答案: