如何用单SELECT语句查询DETAILS表中仅为B类型的客户
仅查询专属B类型客户的单SELECT实现方案
完全可以不用两个独立的SELECT语句实现需求,以下是几种简洁的单条SQL写法:
方法1:GROUP BY + 聚合条件筛选
这是最直接的无嵌套方案,纯单SELECT完成:
SELECT customer_id FROM DETAILS GROUP BY customer_id HAVING COUNT(DISTINCT type) = 1 AND MAX(type) = 'B';
逻辑说明:按customer_id分组后,通过HAVING子句同时判断两个核心条件——该客户的类型唯一(排除同时拥有A、B的情况),且唯一的类型为B,直接筛选出仅属于B类型的客户。
方法2:WHERE + 子查询排除(单条SQL语句)
如果允许使用子查询(整体仍为单条SQL),也可以用以下写法:
SELECT DISTINCT customer_id FROM DETAILS WHERE type = 'B' AND customer_id NOT IN (SELECT customer_id FROM DETAILS WHERE type = 'A');
逻辑说明:先筛选出所有类型为B的客户,再排除掉同时存在类型A的客户,最终得到仅属于B类型的结果。
方法3:窗口函数统计类型数量
利用窗口函数为每条记录标记所属客户的类型总数,再筛选符合条件的记录:
SELECT DISTINCT customer_id FROM ( SELECT customer_id, COUNT(DISTINCT type) OVER (PARTITION BY customer_id) AS type_count, type FROM DETAILS ) t WHERE type_count = 1 AND type = 'B';
逻辑说明:通过窗口函数统计每个客户的类型种类数,之后筛选出类型总数为1且类型为B的客户ID。
内容的提问来源于stack exchange,提问作者p3wcy
相关产品推荐
相关产品推荐

