MySQL使用NOT IN查询无订单客户返回重复结果问题求助
现有SQL问题点
- 笛卡尔积导致重复:最终查询
t1 join t2未指定关联条件,会生成两个表行数的乘积结果,如果t1有5条满足条件的客户,t2的每一条无订单客户都会重复5次,这是你看到重复5次的直接原因。 - t2逻辑错误:无订单的客户不会出现在orders表中,你用
orders o join customers c只能匹配到有订单的客户,不可能拿到无订单群体;同时group by后面跟not in判断条件,语法逻辑完全错误。 - t1筛选条件不符合需求:你写的
count(o.orderNumber) = 5是刚好5单,需求是不少于5单,应该改成>=5。
解决方案
场景1:统一返回所有目标客户,加标识区分类型(最常用)
用左连接关联客户和订单表,直接按客户分组统计订单数,一次过滤出两类目标客户,逻辑清晰不会出现重复:
select c.customerNumber, c.customerName, case when count(o.orderNumber) >=5 then '订单数≥5单' when count(o.orderNumber) =0 then '无任何订单' end as customer_type from customers c left join orders o on c.customerNumber = o.customerNumber group by c.customerNumber, c.customerName having count(o.orderNumber) >=5 or count(o.orderNumber)=0;
场景2:需要两类客户分左右两列展示(对齐你原来的输出格式)
给两个cte加行号,按行号关联避免笛卡尔积,同时修正无订单客户的筛选逻辑:
with t1 as ( -- 筛选订单数≥5的客户 select o.customerNumber, c.customerName, row_number() over(order by c.customerName) as rn from orders o join customers c on o.customerNumber = c.customerNumber group by o.customerNumber, c.customerName having count(o.orderNumber) >= 5 ), t2 as ( -- 筛选无订单的客户 select c.customerNumber, c.customerName, row_number() over(order by c.customerName) as rn from customers c where c.customerNumber not in (select distinct customerNumber from orders) ) select t1.customerNumber as FiveOrderNumber, t1.customerName as FiveOrderName, t2.customerNumber as NoOrderNumber, t2.customerName as NoOrderName from t1 full join t2 on t1.rn = t2.rn order by coalesce(FiveOrderName, NoOrderName);
内容的提问来源于stack exchange,提问作者abrush
相关产品推荐
相关产品推荐

