给定tbl表,如何筛选同时包含productType B和C的订单数据行?
查询同时包含productType B和C的订单所有数据行
我来给你两种实用的SQL写法,都能满足你的需求,你可以根据自己的数据库环境选择:
方法一:分组筛选订单号后关联查询
这种方法先找出同时包含B和C类型的订单编号,再用这些编号去获取对应订单的所有数据:
SELECT t.* FROM tbl t WHERE t.ordernr IN ( SELECT ordernr FROM tbl WHERE productType IN ('B', 'C') GROUP BY ordernr HAVING COUNT(DISTINCT productType) = 2 );
逻辑说明:
- 子查询里先过滤出
productType为B或C的行,按ordernr分组 HAVING COUNT(DISTINCT productType) = 2确保这个订单同时包含B和C两种类型(因为只有两种类型都存在时,去重后的计数才是2)- 最后外层查询获取这些订单的所有数据行
方法二:双重EXISTS验证
这种写法逻辑更直观,直接检查当前行的订单是否同时存在B和C类型的记录:
SELECT t.* FROM tbl t WHERE EXISTS ( SELECT 1 FROM tbl t1 WHERE t1.ordernr = t.ordernr AND t1.productType = 'B' ) AND EXISTS ( SELECT 1 FROM tbl t2 WHERE t2.ordernr = t.ordernr AND t2.productType = 'C' );
逻辑说明:
- 第一个
EXISTS检查当前订单是否有productType为B的记录 - 第二个
EXISTS检查当前订单是否有productType为C的记录 - 只有两个条件都满足时,才保留当前行
执行结果
不管用哪种方法,都会得到你期望的输出:
ordernr productId productType 2 15 B 2 13 C 2 12 A
内容的提问来源于stack exchange,提问作者AlexO
相关产品推荐
相关产品推荐

