创建一个视图以合并 2 个表中的所有数据

Create a view to merge all data from 2 tables

表 A 和表 B 有 N 个同名的列(通用列),每个 table 都有自己的特殊列 - table A 有 X 个额外的列,table B有 Y 个附加列。 Column1* - 是数据库范围内的唯一 ID,因此无法合并 tables A 和 B 中的行。我们需要创建一个 viewAB,它将包含 tables A 和 B 中的所有数据。

我们尝试了 UNION ALL(但如果我们不命名所有列,它会将来自不同列的数据放入单个列),FULL OUTER JOIN 没有帮助,因为在视图中我们可以看到 Common 列出现两次(即 Column1和 Column1_1 等)。理想的解决方案是进行查询,其中我们不需要命名 Common 列(有很多),但如果我们将它们命名就可以了。

查看图片我们希望如何查看我们的数据 (http://imgur.com/u2zT98g)。

请在下面找到用于设置 tables A 和 B 的脚本。

--tableA

CREATE TABLE tableA
(
  Common1 varchar2(50),
  Common2 varchar2(50),
  Common3 varchar2(50),
  A1 varchar2(50),
  A2 varchar2(50),
  A3 varchar2(50),
  CONSTRAINT Common1_pk PRIMARY KEY (Common1)
);

INSERT INTO tableA (Common1, Common2, Common3, A1, A2, A3) VALUES ( '1C1', '1C2', '1C3', '1A1', '1A2', '1A3');
INSERT INTO tableA (Common1, Common2, Common3, A1, A2, A3) VALUES ( '2C1', '2C2', '2C3', '2A1', '2A2', '2A3');
INSERT INTO tableA (Common1, Common2, Common3, A1, A2, A3) VALUES ( '3C1', '3C2', '3C3', '3A1', '3A2', '3A3');

--tableB

CREATE TABLE tableB
(
  Common1 varchar2(50),
  Common2 varchar2(50),
  Common3 varchar2(50),
  B1 varchar2(50),
  B2 varchar2(50),
  B3 varchar2(50),
  B4 varchar2(50),
  CONSTRAINT Common1B_pk PRIMARY KEY (Common1)
);

INSERT INTO tableB (Common1, Common2, Common3, B1, B2, B3, B4) VALUES ( '1C1B', '1C2B', '1C3B', '1B1', '1B2', '1B3', '1B4');
INSERT INTO tableB (Common1, Common2, Common3, B1, B2, B3, B4) VALUES ( '2C1B', '2C2B', '2C3B', '2B1', '2B2', '2B3', '2B4');
INSERT INTO tableB (Common1, Common2, Common3, B1, B2, B3, B4) VALUES ( '3C1B', '3C2B', '3C3B', '3B1', '3B2', '3B3', '3B4');
INSERT INTO tableB (Common1, Common2, Common3, B1, B2, B3, B4) VALUES ( '4C1B', '4C2B', '4C3B', '4B1', '4B2', '4B3', '4B4');


--viewAB
--(  
--  Common1 varchar2(50),
--  Common2 varchar2(50),
--  Common3 varchar2(50),
--  A1 varchar2(50),
--  A2 varchar2(50),
--  A3 varchar2(50),
--  B1 varchar2(50),
--  B2 varchar2(50),
--  B3 varchar2(50),
--  B4 varchar2(50)
--)

您需要指定所有列(您不能使用 select *,因为您已经找到了),union all 来自两个 table 的数据。您可能缺少的是在联合的每个部分中包含来自其他 table 的列的占位符。例如:

SELECT common1, common2, common3,
  a1, a2, a3,
  null AS b1, null AS b2, null AS b3, null AS b4
FROM tableA
UNION ALL
SELECT common1, common2, common3,
  null AS a1, null AS a2, null AS a3,
  b1, b2, b3, b4
FROM tableB

因为您有没有数据类型的空值,您可能需要将 , 强制转换为 varchar2,至少在第一部分是这样,例如

CAST (null AS varchar2(50)) AS b1, ...

SQL Fiddle demo.