创建视图以合并来自2个表的所有数据

时间:2015-04-12 20:37:29

标签: sql view oracle11g merge outer-join

表A和B有N列,具有相同的名称(公共列),每个表都有自己的特殊列 - 表A有X个附加列,表B有Y个附加列。 Column1 * - 是DB范围内的唯一ID,因此表A和B中的行不能合并。我们需要创建一个viewAB,它将包括表A和B中的所有数据。

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

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

请在下面找到设置表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)
--)

1 个答案:

答案 0 :(得分:0)

您需要指定所有列(您已经找不到select *),以及union all来自两个表的数据。您可能缺少的是在联合的每个部分中包含来自另一个表的列的占位符。例如:

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