旧SQL改写后查询结果不一致,寻求技术协助
问题分析与解决
你的核心问题是误解了老SQL语法中多条件左连接的逻辑,错误地将单左连接拆成两次左连接,导致结果集不一致。
原SQL的逻辑拆解
老SQL里的a.columnC *= c.columnD AND a.columnE *= c.columnF是单左连接的复合条件,实际逻辑是:
- a表与b表做内连接(
a.columnA = b.columnB) - 将上述结果与c表做左连接,连接条件需同时满足
a.columnC = c.columnD和a.columnE = c.columnF - 左连接特性:即使c表中没有匹配双条件的行,a+b的行依然会被保留,c表对应字段显示为NULL
你改写后的问题
你写成两次left join c,相当于把c表重复关联了两次:
- 第一次用
a.columnC = c.columnD匹配生成中间结果 - 第二次再用
a.columnE = c.columnF关联中间结果,这会触发不必要的笛卡尔积,导致结果行数、数据与原SQL完全不符
正确的改写方式
将两个左连接条件合并到同一个left join的on子句中,代码如下:
select * from a join b on a.columnA = b.columnB left join c on a.columnC = c.columnD AND a.columnE = c.columnF
特殊情况补充
如果原SQL的实际意图是a.columnC匹配c.columnD 或 a.columnE匹配c.columnF(老语法写法存在歧义),则用OR连接条件:
select * from a join b on a.columnA = b.columnB left join c on a.columnC = c.columnD OR a.columnE = c.columnF
但从原SQL的写法来看,更大概率是双条件同时满足的左连接,优先使用第一种改写方式。
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

