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

SQL查询:查找明细全关闭但主单未关闭的ServiceOrder记录

解决方案

以下是两种常用的SQL实现方案,可直接适配你的业务场景:

方式1:使用NOT EXISTS逻辑(推荐,性能更优、语义清晰)

SELECT so.*
FROM ServiceOrder so
WHERE so.Status != 'C'
  AND NOT EXISTS (
    SELECT 1
    FROM SODetail sod
    WHERE sod.ID = so.ID
      AND sod.Status != 'CP'
);

逻辑说明:先筛选所有未关闭的主单,再排除存在任意一条未关闭明细的主单,剩余结果就是所有明细都已关闭但主单未关闭的记录。

注:如果你的业务规则中「没有关联任何明细的主单」也属于需要修复的范畴,当前写法会自动包含这类记录。如果需要排除无明细的主单,可额外添加如下条件:

AND EXISTS (SELECT 1 FROM SODetail sod WHERE sod.ID = so.ID)

方式2:使用聚合+关联查询

SELECT so.*
FROM ServiceOrder so
JOIN SODetail sod ON so.ID = sod.ID
WHERE so.Status != 'C'
GROUP BY so.ID, so.Status
HAVING MIN(CASE WHEN sod.Status = 'CP' THEN 1 ELSE 0 END) = 1;

逻辑说明:按主单维度分组统计明细状态,当所有明细状态都是CP时,CASE判断的最小值为1,符合筛选条件。这种写法适合需要同时统计明细数量等附加信息的场景。

内容的提问来源于stack exchange,提问作者MarkJoel60

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:36:02