为何两个SQL查询返回结果不同?多表查询转连接改写疑问
逗号分隔隐式连接改显式JOIN后数据不一致的原因分析
以下是导致两个查询返回结果不一致的核心问题:
SELECT字段完全不匹配
原查询的字段选取逻辑:A.column3, D.column6, E.column2, I.column2, E.column3, F.column1, G.column2改写后的字段选取逻辑:
D.column3, E.column6, I.column2, E.column2, F.column3, G.column1字段所属的表完全对应错误,比如原查询取
A表的column3,改写后变成D表的column3;原查询取D表的column6,改写后变成E表的column6,这直接导致返回的字段值完全不同。WHERE过滤条件完全错误
原查询的过滤规则:AND H.ISDELETED<>'T' AND D.ISDELETED<>'T'改写后的过滤规则:
WHERE G.ISDELETED<>'T' AND E.ISDELETED<>'T'过滤的表和字段完全不对,原查询是排除
H表中ISDELETED为'T'的记录,以及D表中ISDELETED为'T'的记录;改写后变成排除G表和E表的对应记录,过滤逻辑完全偏离,返回的数据集自然不一致。原查询存在语法错误
原查询FROM子句中table7 G table8 H之间缺少逗号,正确写法应为table7 G, table8 H,虽然部分数据库可能容错解析,但这属于语法问题,会导致表关联逻辑潜在异常。连接优先级的潜在影响
原查询中LEFT OUTER JOIN table9 I ON H.ID = I.ID的优先级高于逗号分隔的隐式连接,即先执行H和I的左连接,再将结果与其他表做内连接;而改写后的显式连接是先完成A到H的内连接,再左连接I。这部分逻辑理论上一致,但如果原查询因语法错误导致表关联顺序异常,也会影响最终结果。
内容的提问来源于stack exchange,提问作者Lily_Viceroy
相关产品推荐
相关产品推荐

