You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; -- 按组号排序,当前数据(最新日期)优先

关键说明

  1. UNION ALL的作用:将两个独立查询的结果按行合并,不会去重,满足同一GRP_NUM多次出现的需求
  2. 列名统一:两个子查询的列数、数据类型完全对齐,通过别名实现统一输出格式
  3. 条件拆分:
    • 当前数据直接关联GRPTBL取符合CASE_NBR的记录,结束日期设为NULL(匹配期望结果的空白显示)
    • 历史数据额外过滤有效条目(生效日期≠结束日期),避免无效数据混入
  4. 排序优化:通过ORDER BY让同一组的当前数据(最新生效日期)排在前面,与期望结果格式一致

执行上述SQL后,会输出你需要的格式:每个GRP_NUM对应一行当前数据(若存在)和一行历史数据(若存在),列名完全统一,空值自动显示为空白。

内容的提问来源于stack exchange,提问作者Rellek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:45:34