【问题标题】: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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-08
          • 2017-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-31
          • 1970-01-01
          相关资源
          最近更新 更多