给出下表:
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中做到这一点。
答案 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
模式中对DEPT
和SCOTT
表进行了测试。根据需要更改表名称。唯一的限制是表名称必须必须不同。这就是导致自然的完全外部联接成为您想要的联合的原因。
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