如何在SQL Group By查询中添加布尔表达式列检测产品是否含指定材质?
解决方案
你的原查询存在两个核心问题:
EXISTS子查询未关联主查询的Product字段,导致只要表中存在任意一条Black材质的数据,所有产品的Contains_Black都会返回1,无法实现按产品单独判断的需求。- 未对
Product进行分组或去重,最终会返回原表所有行,而非每个产品一行的预期结果。
以下是几种可行的正确查询写法:
方法一:GROUP BY + MAX(CASE...)(推荐,逻辑直观)
通过分组后对每个产品的材质进行判断,取最大值来标记是否包含Black:
SELECT Product, MAX(CASE WHEN Material = 'Black' THEN 1 ELSE 0 END) AS Contains_Black FROM Table1 GROUP BY Product;
方法二:关联EXISTS + 去重/分组
修正原有的自关联逻辑,添加Product关联条件,再通过DISTINCT或GROUP BY得到唯一产品行:
用DISTINCT去重
SELECT DISTINCT A.Product, CASE WHEN EXISTS ( SELECT 1 FROM Table1 AS B WHERE B.Product = A.Product AND B.Material = 'Black' ) THEN 1 ELSE 0 END AS Contains_Black FROM Table1 AS A;
用GROUP BY分组
SELECT A.Product, CASE WHEN EXISTS ( SELECT 1 FROM Table1 AS B WHERE B.Product = A.Product AND B.Material = 'Black' ) THEN 1 ELSE 0 END AS Contains_Black FROM Table1 AS A GROUP BY A.Product;
方法三:窗口函数(适用于支持窗口函数的数据库,如MySQL 8+、PostgreSQL等)
通过窗口函数按产品分区计算最大值,再去重得到结果:
SELECT DISTINCT Product, MAX(CASE WHEN Material = 'Black' THEN 1 ELSE 0 END) OVER (PARTITION BY Product) AS Contains_Black FROM Table1;
内容的提问来源于stack exchange,提问作者Jesús Antonio Martinez
相关产品推荐
相关产品推荐

