MySQL:基于公共关联字段查询两张表的同名字段值差异
原SQL可行性分析
- 完全不可行,存在多个致命问题:
- 没有添加
tID相等的关联条件,隐式笛卡尔积会生成两张表所有行的交叉组合,最终返回的是全表中所有xID不等的跨表行组合,完全不是同一个tID下的xID对比结果 - SELECT子句末尾多了冗余逗号,直接触发语法错误
- 无意义的GROUP BY写法不符合SQL规范,除了MySQL部分旧版本特殊配置外,绝大多数数据库会直接报错,即使执行成功返回的xID取值也是随机的非预期结果
- 输出列不符合需求,重复返回了两次tID字段
- 没有添加
最优实现方案
你需求的核心是按tID对齐两张表的行,再对比同tID下的xID是否不同,直接用内连接关联tID后过滤xID不等的行即可。
基础版(适用xID无NULL的场景)
SELECT t1.tID, t1.xID AS xID1, t2.xID AS xID2 FROM Table1 t1 INNER JOIN Table2 t2 ON t1.tID = t2.tID WHERE t1.xID <> t2.xID;
兼容NULL的版本
如果xID字段可能存在NULL值,需要额外处理NULL的比较逻辑(SQL中NULL <> 任意值的判断结果为UNKNOWN,不会被WHERE条件命中):
SELECT t1.tID, t1.xID AS xID1, t2.xID AS xID2 FROM Table1 t1 INNER JOIN Table2 t2 ON t1.tID = t2.tID WHERE t1.xID <> t2.xID OR (t1.xID IS NULL AND t2.xID IS NOT NULL) OR (t1.xID IS NOT NULL AND t2.xID IS NULL);
内容的提问来源于stack exchange,提问作者Devikiin Dibella
相关产品推荐
相关产品推荐

