【问题标题】:Accessing column alias in postgresql在 postgresql 中访问列别名
【发布时间】:2012-08-20 09:02:53
【问题描述】:

在理解 postgresql 中查询别名的工作方式时遇到了一些麻烦。 我有以下内容:

SELECT DISTINCT robber.robberid,
                nickname,
                Count(accomplices.robberid) AS count1
FROM   robber
       INNER JOIN accomplices
               ON accomplices.robberid = robber.robberid
GROUP  BY robber.robberid,
          robber.nickname
ORDER  BY Count(accomplices.robberid) DESC;


 robberid |            nickname            | count1 
----------+--------------------------------+--------
       14 | Boo Boo Hoff                   |      7
       15 | King Solomon                   |      7
       16 | Bugsy Siegel                   |      7
       23 | Sonny Genovese                 |      6
        1 | Al Capone                      |      5
 ...

我可以使用 as 命令重命名“count1”列,但我似乎无法在查询中再次引用它?我试图在此查询的末尾包含一个 HAVING 命令,以仅查询计数小于最大值一半的对象。

这是家庭作业,但我不是在要求答案,只是一个指向如何将 count1 列包含在另一个子句中的指针。

谁能帮忙?

【问题讨论】:

    标签: sql postgresql nested subquery


    【解决方案1】:

    一般情况下,你不能在后面的查询中引用聚合列的别名,你必须重复聚合

    如果你真的想使用它的名字,你可以把你的查询包装成一个子查询

    SELECT * 
    FROM
    (
        SELECT DISTINCT robber.robberid, nickname, count(accomplices.robberid)  
        AS count1 FROM robber                   
        INNER JOIN accomplices  
        ON accomplices.robberid = robber.robberid  
        GROUP BY robber.robberid, robber.nickname  
    ) v
    ORDER BY count1 desc
    

    【讨论】:

    • 非常感谢 - 这有助于消除我使用子查询的困惑。
    • @jmc 如果您想知道 为什么,您不能在查询后面引用 SELECT 别名,就像在 WHERE 子句中一样,这就是全部与评估顺序有关。 SQL 不会按照其编写的顺序进行评估。 SELECT-list 实际上几乎是最后评估的,并且在处理 HAVING 等时它的内容实际上还不存在。 This becomes important when the select-list includes functions with side-effects;只有在WHERE 子句匹配时,它们才会被执行。
    • 谢谢克雷格。在我的数据库课程中没有得到很好的探索,所以这对我有很大帮助。
    猜你喜欢
    • 2015-08-08
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2011-03-23
    • 2011-03-15
    • 2023-01-02
    相关资源
    最近更新 更多