10

为什么不能在 where 子句中使用临时列?

例如,这个查询:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    1 
GROUP BY 
    product_brand

这会产生两列,一列称为product_brand,一列称为brand_countbrand_count是动态创建的,始终为 1 或 0,具体取决于是否有 50 个或具有该品牌的产品。

所有这一切对我来说都很有意义,除了我不能只brand_count = 1在下面的查询中选择:

Select 
    product_brand, 
   (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
   brand_count = 1 
GROUP BY 
   product_brand

这给了我这个错误:

#1054 - Unknown column 'brand_count' in 'where clause' 
4

5 回答 5

15

改用HAVING

Select
    product_brand,
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
  FROM products
  GROUP BY product_brand
  HAVING brand_count = 1

WHERE在. _ _ 之后进行评估。GROUP BYHAVING

于 2009-03-10T15:40:44.670 回答
3

因为在 SQL 中,列首先是“选定的”,然后是“投影的”。

于 2009-03-10T15:40:50.597 回答
2

您必须使用完整的子句,因此您需要:

Select 
  product_brand, 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM products 
WHERE 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END)  = 1 
GROUP BY product_brand

这对于任何 SQL 语句中的任何计算字段都是相同的。

简化:

Select Max(Points) as Highest where Highest > 10

不会工作,但是:

Select Max(Points) as Highest where Max(Points) > 10

将要。在你的情况下也是一样的。

于 2009-03-10T15:41:09.707 回答
1

因为在完成处理之前它不知道该列是什么。

如果您想按该名称访问该列,则必须使用子查询,否则您将不得不在没有您给它的名称的情况下限定该列,重复您的 case 语句。

于 2009-03-10T15:40:33.453 回答
0

如果我正确阅读了您的意图,您可以重新编写此查询以读取:

Select 
 product_brand,
 COUNT(product_brand) AS brand_count 
FROM 
 products 
GROUP BY 
 product_brand
HAVING 
 COUNT(product_brand) > 50

这将为您提供所有product_brands拥有 a 的count > 50人,还将向您显示每个人的计数。

于 2009-03-10T15:48:41.780 回答