SQL多表关联查询:如何找出BATCH表中的错误配对记录?
找出BATCH表中的错误配对记录
要解决这个问题,核心思路是先通过LOT和FAC的关联得到所有合法的(facName, lotName)配对,再对比BATCH表,找出那些不在合法配对里的记录。下面是两种实用的SQL实现方式:
方法一:使用LEFT JOIN筛选不匹配记录
先通过子查询生成合法配对集合,再将BATCH表与这个集合左连接,筛选出关联失败(即合法配对字段为NULL)的记录:
SELECT b.facName, b.lotName FROM BATCH b LEFT JOIN ( -- 生成所有合法的(facName, lotName)配对 SELECT l.lotName, f.facName FROM LOT l INNER JOIN FAC f ON l.facID = f.ID ) valid_pairs ON b.lotName = valid_pairs.lotName AND b.facName = valid_pairs.facName -- 筛选出不在合法配对中的BATCH记录 WHERE valid_pairs.lotName IS NULL;
逻辑解释:
- 子查询
valid_pairs通过LOT和FAC的关联(l.facID = f.ID),得到每个批次(lotName)对应的正确工厂名称(facName); - BATCH表与
valid_pairs左连接,匹配条件是批次名和工厂名都完全一致; - 那些在BATCH中但不在合法配对里的记录,会导致
valid_pairs的字段为NULL,通过WHERE子句筛选这些记录即可得到错误数据。
方法二:使用NOT EXISTS直接判断
这种写法更直观,直接检查BATCH中的每条记录是否存在对应的合法关联:
SELECT b.facName, b.lotName FROM BATCH b WHERE NOT EXISTS ( SELECT 1 FROM LOT l INNER JOIN FAC f ON l.facID = f.ID -- 匹配条件:批次名相同,且工厂名对应合法关联 WHERE l.lotName = b.lotName AND f.facName = b.facName );
逻辑解释:
对于BATCH表中的每一条记录,我们检查是否存在一条LOT-FAC关联记录,满足批次名相同且工厂名匹配。如果不存在这样的记录,说明这条BATCH记录是错误的。
用你的测试数据验证
拿你给出的例子代入:
- LOT表:(lot1,1)、(lot2,2)
- FAC表:(1,fac1)、(2,fac2)
- 合法配对集合是(lot1,fac1)、(lot2,fac2)
- BATCH表中的(fac1,lot2)不在合法集合中,会被上述两种SQL语句筛选出来,正是我们要找的错误记录。
内容的提问来源于stack exchange,提问作者OY555
相关产品推荐
相关产品推荐

