派生表关联查询结果不一致问题排查
为什么两个左连接查询结果存在差异?
你的两个SQL查询结果不同,核心原因在于右表的数据范围变化,再加上一个潜在的SQL笔误影响:
1. 带筛选条件时能返回null行的原因
带筛选的查询里:
- 左表
z只取了numb='1'、numb_type为G1/G15的white类型数据; - 右表
x是tbl_1和ha.tbl_2的内连接(逗号+where条件等价于内连接),同时限定了a.numb='1',只有在ha.tbl_2里能找到对应acct的numb='1'数据才会留在x里。
如果G15的行在ha.tbl_2中没有匹配的acct记录,那x里就不会有G15的条目。左连接时,z里的G15行找不到x中的匹配项,自然会返回x字段全为null的行,这就是你看到的预期结果。
2. 移除筛选后看不到null行的原因
去掉筛选条件后:
- 左表
z包含所有white类型的数据,范围大幅扩大; - 右表
x也包含所有white类型且在ha.tbl_2有匹配acct的数据,范围同步扩大。
这时候出现两种可能:
- 全量数据里,
G15的行在x中找到了满足连接条件substr(x.col_2,2,2) = substr(z.acct,2,2) and x.numb = z.numb的记录,所以x字段不为null,自然不会显示你预期的null行; - 你的
x子查询存在明显笔误:select里写了sum(a1.amt),但from里只有tbl_1 a和ha.tbl_2,根本没有a1这个表别名。这个错误会导致数据库解析异常,要么直接报错,要么产生意外的笛卡尔积/错误聚合结果,让原本应该无匹配的行意外匹配到了x的数据。
另外,你提供的全量查询结果可能只展示了部分行,G15的null行实际存在但未被列出;或者z和x的group by字段不同(z按a1.col_1,a1.col_2分组,x按a.col_1,ha.col_2分组),全量数据下分组后的行结构变化,导致连接条件的匹配结果改变。
内容的提问来源于stack exchange,提问作者Deitz928
相关产品推荐
相关产品推荐

