Oracle多表查询:为不同表列统一别名并按行返回结果
Oracle合并当前与历史数据表并统一列名的解决方案
你的问题核心是错误使用JOIN将两张表的内容合并到同一行,而需求是将当前表和历史表的数据分别作为独立行返回,同时统一列名。正确做法是用UNION ALL分别查询两张表,再合并结果集。
修正后的SQL语句
-- 查询当前数据 SELECT TRIM(GR.GROUP_SEQ) AS GRP_NUM, CT.CONTRACT AS CONT_CD, CT.CONTRACT_EFF AS CONT_EFF_DT, NULL AS CONT_END_DT FROM GRPTBL GR INNER JOIN CURRCNT CT ON CT.GROUP_SEQ = GR.GROUP_SEQ WHERE TRIM(GR.CASE_NBR) = 'DEF001' UNION ALL -- 查询有效历史数据 SELECT TRIM(GR.GROUP_SEQ) AS GRP_NUM, CH.H_CONT AS CONT_CD, CH.HST_EFF AS CONT_EFF_DT, CH.HST_END_DTE AS CONT_END_DT FROM GRPTBL GR INNER JOIN HISTCNT CH ON GR.GROUP_SEQ = CH.GROUP_SEQ WHERE TRIM(GR.CASE_NBR) = 'DEF001' AND CH.HST_EFF <> CH.HST_END_DTE -- 过滤无效历史记录 ORDER BY GRP_NUM, CONT_EFF_DT DESC; -- 按组号排序,当前数据(最新日期)优先
关键说明
- UNION ALL的作用:将两个独立查询的结果按行合并,不会去重,满足同一GRP_NUM多次出现的需求
- 列名统一:两个子查询的列数、数据类型完全对齐,通过别名实现统一输出格式
- 条件拆分:
- 当前数据直接关联GRPTBL取符合CASE_NBR的记录,结束日期设为
NULL(匹配期望结果的空白显示) - 历史数据额外过滤有效条目(生效日期≠结束日期),避免无效数据混入
- 当前数据直接关联GRPTBL取符合CASE_NBR的记录,结束日期设为
- 排序优化:通过
ORDER BY让同一组的当前数据(最新生效日期)排在前面,与期望结果格式一致
执行上述SQL后,会输出你需要的格式:每个GRP_NUM对应一行当前数据(若存在)和一行历史数据(若存在),列名完全统一,空值自动显示为空白。
内容的提问来源于stack exchange,提问作者Rellek
相关产品推荐
相关产品推荐

