2015-04-12 84 views
0

表A和B具有N個具有相同名稱(通用列)的列,每個表都有其自己的特殊列 - 表A具有X個附加列,而表B具有Y個附加列。 Column1 * - 是DB範圍的唯一ID,因此表A和B中的行不能合併。我們需要創建一個包含表A和B中所有數據的viewAB。創建視圖合併來自2個表的所有數據

我們嘗試了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) 
--) 

回答

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

+0

謝謝亞歷克斯,這種方法似乎工作正常。如果我們沒有找到實現這一目標的方法而不提及所有列,我們將以這種方式實施。這對我們來說並不完美,因爲我們在表A和B中有大約100-150列,並且新列可能每週出現一次,所以保持此視圖將需要一些時間。感謝您使用SQL小提琴鏈接 - 我一直在尋找類似的幾周演示工具=) – Zaplatki

+0

@ivang - 您可以使用動態SQL編寫一個PL/SQL塊(或存儲過程)以從數據字典中生成視圖源代碼。但是,如果列更改,那麼引用視圖的代碼也將發生變化,維護視圖可能會成爲模式維護的一部分。 –

+0

謝謝你,我們決定完全按照你的建議去做,似乎這是最好的選擇。 – Zaplatki

相關問題