为什么我不能在count(*)“column”中使用别名并在having子句中引用它?

时间:2010-01-15 00:45:00

标签: sql sql-server alias

我想知道为什么我不能在count(*)中使用别名并在having子句中引用它。例如:

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having _count > 0

不行。但是如果我删除_count并使用count(*)代替它。

8 个答案:

答案 0 :(得分:90)

document referencedCodeByMoonlightanswer旁边查看your recent question

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

  
      
  1. 首先形成 from 子句中所有表格的产品。
  2.   
  3. 然后评估 where 子句以消除不满足的行   search_condition。
  4.   
  5. 接下来,使用 group by 子句中的列对行进行分组。
  6.   
  7. 然后,不满足中的search_condition的组   条款已被删除。
  8.   
  9. 接下来, select 子句目标列表中的表达式为   评价。
  10.   
  11. 如果select子句中存在 distinct 关键字,则重复行   现已被淘汰。
  12.   
  13. 评估每个子选择后,联合
  14.   
  15. 最后,根据列对结果行进行排序   在订单子句中指定。
  16.   

答案 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是指什么?设计人员只是选择使别名仅出现在查询的“外部”。