MySQL关联表查询:如何按匹配条件排除整组ID的所有关联行
按批次维度批量过滤关联数据的实现
原有查询的核心问题
之前的查询判断粒度停留在单条样本行层面,仅通过WHERE子句过滤单条不符合状态的QC记录,没有在BatchNo维度做合规性判断,因此只能剔除单条不合格样本,无法实现“只要批次存在不合格QC,就整体排除该批次所有关联行”的需求。同时原SQL存在拼写错误:
sample_tables.SampleType中表名多写了后缀s,执行时会报字段不存在的错误。
实现方案
整个方案完全使用标准SELECT语法实现,不涉及任何临时表创建操作,不需要特殊数据库权限,核心逻辑如下:
- 先聚合计算筛出所有满足QC规则的合规BatchNo集合
- 通过BatchNo匹配保留对应的所有关联行,只要批次不合规,该批次下所有普通样本、QC样本的关联行都会被整体排除
合规批次的判定规则:该批次下所有SampleType为Batch_QC_1/Batch_QC_2的样本行,不存在Status不等于'pass'的记录。
可直接运行的查询代码
SELECT s.SampleNo, s.SampleType, s.BatchNo, s.Status, b.Info FROM batch_table b JOIN sample_table s ON b.BatchNo = s.BatchNo WHERE b.BatchNo IN ( -- 子查询直接筛选合规BatchNo,无需创建临时表 SELECT BatchNo FROM sample_table WHERE SampleType IN ('Batch_QC_1', 'Batch_QC_2') GROUP BY BatchNo -- 判定:QC样本中状态非pass的记录数为0 HAVING SUM(CASE WHEN Status != 'pass' THEN 1 ELSE 0 END) = 0 )
边界规则调整
若业务要求将无QC样本的批次也判定为不合格,需整体排除该类批次,只需在聚合的HAVING判断中追加存在性校验即可:
HAVING COUNT(*) > 0 -- 校验批次至少存在1条QC样本 AND SUM(CASE WHEN Status != 'pass' THEN 1 ELSE 0 END) = 0
内容的提问来源于stack exchange,提问作者JayB
相关产品推荐
相关产品推荐

