如何将列不全相同的三张SQL表合并为包含所有列的统一结果表
错误原因分析
- 第一种FULL OUTER JOIN方案报错:你用
SELECT *查询时,三张表存在重名字段(比如#no_change_or_transfer和#left_in_aug都有prvs_loan_num、prvs_wac等字段),数据库无法识别重复列名,因此抛出错误。 - 第二种UNION方案报错:UNION操作要求所有子查询返回的列数量、对应列的数据类型完全一致,你三张表列数分别为6、3、3,不满足匹配规则,因此报错。
正确实现方案
你可以通过补全空缺字段+UNION ALL实现需求,不需要关联操作,逻辑简单且对大表性能更友好,代码如下:
SELECT * INTO #month_over_month FROM ( -- 直接取已有全字段的存量表 SELECT prvs_loan_num, prvs_wac, prvs_tni, cur_loan_num, cur_wac, cur_tni FROM #no_change_or_transfer UNION ALL -- 8月流失表补全cur前缀的空缺字段为NULL SELECT prvs_loan_num, prvs_wac, prvs_tni, NULL AS cur_loan_num, NULL AS cur_wac, NULL AS cur_tni FROM #left_in_aug UNION ALL -- 9月新增表补全prvs前缀的空缺字段为NULL SELECT NULL AS prvs_loan_num, NULL AS prvs_wac, NULL AS prvs_tni, cur_loan_num, cur_wac, cur_tni FROM #joined_in_sept ) AS combined
如果prvs_和cur_前缀的字段各有20个,只需要对应补全20个NULL值即可,无需修改逻辑。
方案说明
- 用
UNION ALL而非UNION:三张表的数据不存在重叠,不需要去重,UNION ALL跳过了去重排序步骤,对100万行的大表执行效率高很多。 - 无需关联操作:避免了大表关联的性能开销,也不会出现JOIN可能导致的字段匹配错误问题。
内容的提问来源于stack exchange,提问作者gernworm
相关产品推荐
相关产品推荐

