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

MySQL查询chem_qc_stage1相对chem_qc_stage2的不匹配行实现方案

问题根因

你原来的NOT EXISTS子查询没有和外层查询的行做字段关联,只要chem_qc_stage2里存在任意一条m_m_no='318'的记录,NOT EXISTS的判断结果就为假,所以最终返回空结果,完全没有逐行匹配两个表的三个关键字段。

可行查询方案

方案1:带关联条件的NOT EXISTS(最稳妥,空表也正常返回)

修改NOT EXISTS的子查询,增加和外层表的字段匹配逻辑即可:

SELECT chem_name, raw_mat, blnd_no
FROM chem_qc_stage1 s1
WHERE s1.m_m_no = '318'
AND NOT EXISTS (
    SELECT 1
    FROM chem_qc_stage2 s2
    WHERE s2.m_m_no = '318'
      AND s2.chem_name = s1.chem_name
      AND s2.raw_mat = s1.raw_mat
      AND s2.blnd_no = s1.blnd_no
);

执行结果

返回预期的两条不匹配记录:

+-----------+---------+---------+
| chem_name | raw_mat | blnd_no |
+-----------+---------+---------+
| HTPB      | YY      | ZZ      |
| HTPB      | FF      | FF      |
+-----------+---------+---------+

就算chem_qc_stage2中没有任何符合m_m_no='318'的记录,子查询会对所有外层行返回真,会返回stage1中所有符合m_m_no='318'的记录,符合要求。

方案2:LEFT JOIN + 空值判断

也可以用左连接后判断stage2匹配字段为空的方式实现,效果完全一致:

SELECT s1.chem_name, s1.raw_mat, s1.blnd_no
FROM chem_qc_stage1 s1
LEFT JOIN chem_qc_stage2 s2
  ON s2.m_m_no = '318'
  AND s2.chem_name = s1.chem_name
  AND s2.raw_mat = s1.raw_mat
  AND s2.blnd_no = s1.blnd_no
WHERE s1.m_m_no = '318'
  AND s2.chem_name IS NULL;

内容的提问来源于stack exchange,提问作者Amit K Kushwaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:54:03