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
相关产品推荐
相关产品推荐

