访问postgresql中的列别名

jmc*_*jmc 2 sql postgresql nested subquery

理解查询别名在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
 ...
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以帮忙吗?

pod*_*ska 6

通常,您不能在查询中稍后引用聚合列的别名,并且必须重复聚合

如果您确实想使用其名称,可以将查询包装为子查询

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
Run Code Online (Sandbox Code Playgroud)

  • @jmc如果您想知道*为什么*您不能在查询后面引用`SELECT`别名,就像在`WHERE`子句中那样,它与评估顺序有关.SQL不按其编写顺序进行评估."SELECT"列表实际上几乎是最后评估的,当处理"HAVING"等时,它的内容实际上还不存在.当选择列表包括具有副作用的功能时,这变得很重要; 它们只应在`WHERE`子句匹配时执行. (4认同)