如何合并多个具有相同名称的列的表

时间:2020-03-10 11:36:09

标签: sql oracle

给出下表:

Table B                       Table C
ID    PROP_A    PROB_B        ID    PROP_A    PROP_C
-----------------------       -----------------------
1     V1        V1            1     V2        V2
2     V2        V2            2     V3        V3
3     V3        V3            3     V4        V4

我想取消合并这些表以获得以下结果:

Table B+C
ID    TABLE_NAME    PROP_A    PROP_B    PROP_C
-----------------------------------------------------
1     B             V1        V1        null
2     B             V2        V2        null
3     B             V3        V3        null
1     C             V2        null      V2
2     C             V3        null      V3
3     C             V4        null      V4

我正在寻找一种与数据库技术(标准SQL)无关的解决方案。但是,对于依赖技术的SQL,我想知道如何在Oracle中做到这一点。

3 个答案:

答案 0 :(得分:2)

这听起来像union all

select id, 'B' as table_name, prop_a, prop_b, null as prop_c
from b
union all
select id, 'C' as table_name, prop_a, null as prop_b, prop_c
from c;

答案 1 :(得分:1)

奇怪的是,您希望输出中的TABLE_NAME列作为第二列,而不是第一列。那重要吗?

如果不是-如果将其作为第一列是可以的-那么有一种解决方案不需要您预先知道两个表的的数量和名称。它使用标准中的natural full outer join

我没有您的表,因此我在EMP模式中对DEPTSCOTT表进行了测试。根据需要更改表名称。唯一的限制是表名称必须必须不同。这就是导致自然的完全外部联接成为您想要的联合的原因。

select *
from   (select 'EMP'  as table_name, e.* from scott.emp  e)
       natural full outer join
       (select 'DEPT' as table_name, d.* from scott.dept d)
;

答案 2 :(得分:0)

只需确保两个选择中都包含所有列。您可以使用静态值,如下所示:

SELECT b.ID, 'B' AS TABLE_NAME, b.PROP_A, b.PROP_B, NULL AS PROP_C
FROM b
UNION ALL
SELECT c.ID, 'C' AS TABLE_NAME, c.PROP_A, NULL AS PROP_B, c.PROP_C
FROM c