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
相关产品推荐
相关产品推荐

