SQL如何查询多记录存储的工单工序表中缺失锯切工序的所有工单
缺失Saw工序的工单SQL查询实现方案
你之前使用WHERE Process != 'Saw'的逻辑错误原因是,该写法仅做行级过滤,只排除了单条记录为Saw的行,没有从工单整体维度判断该工单下是否包含Saw工序,因此需要按工单维度做聚合或子查询匹配来实现需求,现有表结构完全可以满足查询要求,以下是3种常用的实现逻辑:
方案1:GROUP BY + 条件聚合(最简洁常用)
按工单号分组后,统计每个工单下Saw工序的出现次数,筛选次数为0的工单即可:
SELECT Workorder FROM 替换为你的实际表名 GROUP BY Workorder HAVING SUM(CASE WHEN Process = 'Saw' THEN 1 ELSE 0 END) = 0;
如果使用支持COUNT_IF函数的数据库(比如Snowflake、BigQuery等),还可以简化为:
SELECT Workorder FROM 替换为你的实际表名 GROUP BY Workorder HAVING COUNT_IF(Process = 'Saw') = 0;
方案2:NOT EXISTS 子查询
逻辑为筛选所有不存在对应Saw工序记录的工单:
SELECT DISTINCT t.Workorder FROM 替换为你的实际表名 t WHERE NOT EXISTS ( SELECT 1 FROM 替换为你的实际表名 t2 WHERE t2.Workorder = t.Workorder AND t2.Process = 'Saw' );
方案3:LEFT JOIN 空值匹配
左连接关联同一工单的Saw工序记录,关联结果为空的就是缺失该工序的工单:
SELECT DISTINCT t1.Workorder FROM 替换为你的实际表名 t1 LEFT JOIN 替换为你的实际表名 t2 ON t1.Workorder = t2.Workorder AND t2.Process = 'Saw' WHERE t2.Workorder IS NULL;
以上三种方案均可正确返回示例数据中的工单号2,可根据你使用的数据库类型、表索引情况选择效率最优的写法。
内容的提问来源于stack exchange,提问作者C Szabo
相关产品推荐
相关产品推荐

