【问题标题】:Create a view to merge all data from 2 tables创建一个视图以合并 2 个表中的所有数据
【发布时间】:2015-06-18 02:48:25
【问题描述】:

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

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

查看图片我们希望如何查看我们的数据 (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)
--)

【问题讨论】:

    标签: sql view oracle11g merge outer-join


    【解决方案1】:

    你需要指定所有的列(你不能使用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 转换为 varchar2,至少在第一部分,例如

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

    SQL Fiddle demo.

    【讨论】:

    • 谢谢你,亚历克斯,这种方法似乎工作正常。如果我们在不提及所有列的情况下找不到实现相同目标的方法,我们将以这种方式实现它。这对我们来说并不完美,因为我们在表 A 和 B 中有大约 100-150 列,并且每周可能会出现新列,所以维护这个视图需要一些时间。谢谢你的 SQL Fiddle 链接——我在找几周的类似演示工具=)
    • @ivang - 您可以编写一个 PL/SQL 块(或存储过程)来使用动态 SQL 从数据字典生成视图源代码。但是如果列发生变化,那么引用视图的代码也会发生变化,维护视图可能是模式维护的一部分。
    • 谢谢你,我们决定完全按照你的建议去做,看来这是最好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2021-10-20
    • 1970-01-01
    • 2020-06-10
    • 2010-09-22
    • 2016-07-26
    相关资源
    最近更新 更多