为什么我不能在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_count
。 brand_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'
答案 0 :(得分:14)
改为使用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
在<{em> GROUP BY
之前评估。 HAVING
在{。<}后评估。
答案 1 :(得分:2)
因为在SQL中,列首先“选中”然后“投射”。
答案 2 :(得分: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
意愿。你的情况也一样。
答案 3 :(得分:0)
因为在完成处理之前它不知道该列是什么。
如果要按该名称访问该列,则必须使用子查询,否则您将不必使用您提供的名称来限定该列,重复您的案例陈述。
答案 4 :(得分:0)
如果我正确阅读了您的意图,您可以重新编写此查询以阅读:
Select
product_brand,
COUNT(product_brand) AS brand_count
FROM
products
GROUP BY
product_brand
HAVING
COUNT(product_brand) > 50
这将为您提供product_brands
的所有count > 50
,并向您展示
每个的计数。