我想知道为什么我不能在count(*)中使用别名并在having子句中引用它。例如:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
不行。但是如果我删除_count并使用count(*)代替它。
答案 0 :(得分:90)
在document referenced至CodeByMoonlight的answer旁边查看your recent question。
在SELECT之前评估HAVING子句 - 因此服务器还不知道该别名。
- 首先形成 from 子句中所有表格的产品。
- 然后评估 where 子句以消除不满足的行 search_condition。
- 接下来,使用 group by 子句中的列对行进行分组。
- 然后,不满足中的search_condition的组 条款已被删除。
- 接下来, select 子句目标列表中的表达式为 评价。
- 如果select子句中存在 distinct 关键字,则重复行 现已被淘汰。
- 评估每个子选择后,联合。
- 最后,根据列对结果行进行排序 在订单子句中指定。
醇>
答案 1 :(得分:11)
select
子句是逻辑上执行的最后一个子句,order by
除外。 having
子句在select之前发生,因此别名尚不可用。
如果您真的想使用别名,而不是我建议这样做,可以使用内联视图来使别名可用:
select StoreId, _count
from (select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id) T
where _count > 0
或者在SQL Server 2005及更高版本中,CTE:
; with T as (select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id)
select StoreId, _count
from T
where _count > 0
答案 2 :(得分:4)
你可以在select子句中使用count的别名,你只是不能在having语句中使用它,所以这可以工作
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having count(*) > 0
答案 3 :(得分:1)
字段名称的别名仅用于命名结果中的列,它们永远不能在查询中使用。你不能这样做:
select Store_id as Asdf
from StoreProduct
where Asdf = 42
但是,您可以在两个地方安全地使用count(*)
,数据库会识别它是相同的值,因此不会计算两次。
答案 4 :(得分:0)
您可以在SQL中使用聚合的别名,但这只是在结果标题中显示别名。但是当你想要使用聚合函数的条件时,你仍然需要使用聚合,因为它评估函数而不是名称。
答案 5 :(得分:0)
在Hive 0.11.0及更高版本中,如果hive.groupby.orderby.position.alias设置为true,则可以按位置指定列。
set hive.groupby.orderby.position.alias=true;
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by 1
我不明白你的查询的目的。 根据您发布的查询的上下文,您的条件不是必需的,因为不存在的项目,即即count 0,永远不会是查询的结果......
答案 6 :(得分:0)
这是我的贡献(基于此处发布的代码):
select * from (
SELECT Store_id as StoreId, Count(*) as StoreCount
FROM StoreProduct
group by Store_id
) data
where data.StoreCount > 0
答案 7 :(得分:-1)
可能是因为这是sql定义命名空间的方式。拿,例如:
select a as b, b as a
from table
where b = '5'
order by a
a和b是指什么?设计人员只是选择使别名仅出现在查询的“外部”。