如何编写SQL查询筛选所有关联方状态均为COMP的订单
解决方案:筛选所有关联方状态均为COMP的订单
我来帮你解决这个问题,针对你的数据集需求,这里有几种高效的SQL实现方式,都能精准筛选出所有关联方状态全为COMP的订单(只要订单存在任意NOTCOMP状态就排除):
问题回顾
你提供的数据集如下:
| Order | Party | Party Status |
|---|---|---|
| 1 | P1 | COMP |
| 1 | P2 | NOTCOMP |
| 2 | P3 | COMP |
| 2 | P1 | COMP |
| 1 | P3 | NOTCOMP |
| 3 | P6 | COMP |
预期结果是仅返回订单2和3。
解法1:GROUP BY + HAVING(最直观的分组筛选)
这种方法通过按订单分组,检查分组内是否存在NOTCOMP状态的记录:
SELECT "Order" FROM your_subquery -- 替换为你的子查询或实际表名 GROUP BY "Order" HAVING COUNT(CASE WHEN "Party Status" = 'NOTCOMP' THEN 1 END) = 0;
原理:CASE语句会为每个NOTCOMP的记录标记1,其他为NULL;COUNT()只统计非NULL值,当结果为0时说明该订单没有任何NOTCOMP的关联方。
你也可以用更简洁的写法,利用MAX()函数判断是否存在无效状态:
SELECT "Order" FROM your_subquery GROUP BY "Order" HAVING MAX(CASE WHEN "Party Status" != 'COMP' THEN 1 ELSE 0 END) = 0;
解法2:NOT EXISTS 子查询(适用于大表的高效查询)
通过子查询找出所有包含NOTCOMP状态的订单,然后在主查询中排除这些订单:
SELECT DISTINCT "Order" FROM your_subquery t1 WHERE NOT EXISTS ( SELECT 1 FROM your_subquery t2 WHERE t2."Order" = t1."Order" AND t2."Party Status" = 'NOTCOMP' );
原理:NOT EXISTS会检查是否存在满足条件的子记录,当不存在时就保留当前订单;DISTINCT确保每个订单只返回一次。
解法3:窗口函数(需要保留关联方详情时使用)
如果需要返回订单的所有关联方信息,同时确保该订单没有NOTCOMP状态,可以用窗口函数标记每个订单的状态:
WITH order_status_summary AS ( SELECT *, -- 为每个订单标记是否存在NOTCOMP状态 MAX(CASE WHEN "Party Status" = 'NOTCOMP' THEN 1 ELSE 0 END) OVER (PARTITION BY "Order") AS has_invalid_party FROM your_subquery ) SELECT "Order", Party, "Party Status" FROM order_status_summary WHERE has_invalid_party = 0;
这种方法会返回订单2和3的所有关联行,而不仅仅是订单号。
结果验证
以上所有查询都会得到你预期的结果:
| Order |
|---|
| 2 |
| 3 |
如果使用解法3,会返回更详细的信息:
| Order | Party | Party Status |
|---|---|---|
| 2 | P3 | COMP |
| 2 | P1 | COMP |
| 3 | P6 | COMP |
内容的提问来源于stack exchange,提问作者SBORA
相关产品推荐
相关产品推荐

