为什么我不能在having子句中为聚合使用别名?

sky*_*per 33 sql sql-server-2008

我的代码如下所示:

select col1,count(col2) as col7
from --some join operation
group by col1
having col7 >= 3 -- replace col7 by count(col2) to make the code work
Run Code Online (Sandbox Code Playgroud)

我的代码导致错误"无效的列名'col7'".为什么会这样?SQL不允许我在最后一行使用col7似乎不合逻辑.

我正在使用SQL server express 2008

kri*_*hna 33

在SELECT之前评估HAVING子句 - 因此服务器还不知道该别名.

1.首先形成FROM CLAUSE中所有表格的产品.
2.然后评估WHERE CLAUSE以消除不满足search_condition的行.
3.接下来,使用GROUP BY CLAUSE中的列对行进行分组.
4.然后,消除了不满足HAVING CLAUSE中的search_condition的组.
5.接下来,将评估SELECT CLAUSE目标列表中的表达式.
6.如果select子句中存在DISTINCT关键字,则现在会删除重复的行.
7.在评估每个子选择后,取消UNION.
8.最后,生成的行根据ORDER BY CLAUSE中指定的列进行排序.
9.TOP CLAUSE已执行

希望这能回答你的问题!!!
它还解释了为什么别名在ORDER BY子句中起作用.

  • 同时,在 Postgres 中,你可以在“GROUP BY”中使用别名,但仍然不能在“HAVING”中使用......在这里你的理论完全崩溃了。 (2认同)

Bra*_*ore 24

在MS SQL中,唯一可以引用别名的地方(我知道)在ORDER BY子句中.在查询的其他部分引用别名的能力是许多其他数据库平台所具有的功能,老实说,它让我很恼火,微软并没有认为它是一个足够有用的功能来添加它.

  • 很确定 PostgreSQL 也不允许您在 HAVING 子句中放置别名。 (3认同)

小智 10

您应该选择两次才能使用 count() 列

select * from (select col1,count(col2) as col7
from --some join operation
group by col1) as temp
where temp.col7 >= 3
Run Code Online (Sandbox Code Playgroud)


Pra*_*tik 7

尝试使用这个,因为选择列表包含您也可以在 have 子句中使用的相同表达式:

SELECT COL1,COUNT(COL2) AS COL7
FROM --SOME JOIN OPERATION
GROUP BY COL1
HAVING COUNT(COL2) >= 3 
Run Code Online (Sandbox Code Playgroud)