SQL合并同列名不同数据的两张表:Join无结果问题排查
数据表合并问题排查与正确实现
问题说明
需合并两个结构完全一致(42个相同列名)但数据不同的表,最终结果要包含两张表的所有数据行。当前使用FULL OUTER JOIN的SQL执行后无返回行,但单独查询两张表均有结果,需排查问题并给出正确方案。
现有代码问题分析
- 错误使用关联查询而非行合并:
FULL OUTER JOIN是按关联键匹配两张表的行,并非合并所有行,和需求完全不符。 - WHERE条件导致无结果:
FULL JOIN后,当某张表无匹配行时,对应字段会为NULL,但现有WHERE条件同时要求b.column2 like '%ff%'、a.column2 like '%ff%'等涉及两张表的非空条件,只要任意一侧无匹配行,条件就不满足,最终返回空集。 - 列选择错误:现有SELECT同时选取
b和a的所有列,会生成84列的结果,和目标的42列合并结果不符。
正确实现方案
由于两张表结构完全一致,应使用UNION ALL(保留所有行,包括重复)或UNION(自动去重)来合并行,同时将各自的过滤条件放在对应的子查询中:
修改后的代码
# directory where report results will be saved report_result = r"path\report_result_%s.csv"%today report_result_sql_query =""" SELECT column1, column2, column3, ..., column42 FROM table1 WHERE column2 like '%ff%' AND column5 >= '{}' UNION ALL SELECT column1, column2, column3, ..., column42 FROM table2 WHERE (column3 is null or column3= '0' or column3= ' ') AND column2 like '%ff%' AND column5 >= '{}' """.format(day, yyday) print(report_result_sql_query) report_result_colour = web_service(report_result_sql_query) print(report_result_colour.shape) report_result_colour.to_csv(report_result, index=False)
方案说明
UNION ALL:直接合并两张表的查询结果,保留所有行,性能比UNION更高(无需去重),符合需求中的“包含两张表所有数据行”。- 子查询过滤:将针对
table1和table2的过滤条件分别放在各自的FROM子句后,确保只筛选出符合条件的行再合并。 - 列一致性:两张表的SELECT列完全一致,保证合并后的结果列数和结构与原表一致。
示例验证
对应你提供的示例表:
- DT1和DT2结构一致,使用
UNION ALL合并后,会直接将DT1的所有行和DT2的所有行拼接,得到你期望的DT Result。
内容的提问来源于stack exchange,提问作者ahmad
相关产品推荐
相关产品推荐

