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

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;

逻辑解释:

  1. 子查询valid_pairs通过LOT和FAC的关联(l.facID = f.ID),得到每个批次(lotName)对应的正确工厂名称(facName);
  2. BATCH表与valid_pairs左连接,匹配条件是批次名和工厂名都完全一致;
  3. 那些在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:06:21