You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:47:47