2011-07-19 44 views
4

我有多個表,其中有大約10個公共列,但有些表中有1-2個額外的列。如何組合多個表,在列中略有不同

我想將每個表中每行的所有這些表合併到一個表中,對於每個特定行的源表中不存在的任何列使用NULL值。

所以我的輸入大致如下:

table1 
id | colA | colB 

table2 
id | colA | colB | colC 

table3 
id | colA | colB | colD 

,我試圖讓這個:

allTables 
id | colA | colB | colC | colD 

在上面的例子中,從表1中的所有行必須NULL值COLC和冷在所有表中,來自表2的所有行將具有colD的空值,並且來自table3的所有行將在colC中具有空值。

一對夫婦的注意事項:

  • 列ID是不一樣的或以任何方式
  • 我的例子顯示了3桌表之間的關係,但我有大約8-9。
  • 每個源表格中都有重複的行,應該保留。

特別是我很感興趣,如果有類似的頂端答案投票一個here或類似的東西這是更廣義的。

回答

4
SELECT 
    id, 
    colA, 
    colB, 
    NULL AS colC, 
    NULL AS colD 
FROM 
    Table1 
UNION ALL 
SELECT 
    id, 
    colA, 
    colB, 
    colC, 
    NULL AS colD 
FROM 
    Table2 
UNION ALL 
SELECT 
    id, 
    colA, 
    colB, 
    NULL AS colC, 
    colD 
FROM 
    Table3 

由於id不相關,所以如果表之間存在重複的情況,您可能還需要跟蹤該行來自哪個表。爲此,只需在三個SELECT語句中的每一個語句中使用具有不同值的別名的硬編碼值。

+0

你最後的部分有ColC沒有。 – Jacob

+0

謝謝...現在糾正它。 –

3

您可以使用UNION

  SELECT id, colA, colB, null AS colC, null AS colD FROM table1 
UNION ALL SELECT id, colA, colB,   colC, null AS colD FROM table2 
UNION ALL SELECT id, colA, colB, null AS colC,   colD FROM table3; 

正如在評論中討論,你可以用UNION/UNION DISTINCT改變這一點,如果你想從不同的表中丟棄重複。感謝評論者。

+0

你可能會用更好的UNION ALL關閉。否則,我的投票。 – bobs

+0

UNION將丟失任何重複的行。這個問題沒有說明是否可以,但應該指出。 –

+0

@Bobs:這可能是一個好主意,編輯!感謝:-) –

3

你可以試試這個:

SELECT id, colA, colB, NULL AS colc, NULL AS cold 
FROM table1 

UNION ALL 

SELECT id, colA, colB, colc, NULL AS cold 
FROM table2 

UNION ALL 

SELECT id, colA, colB, NULL AS colc, cold 
FROM table3 
0

你需要的是一個UNION

SELECT id, colA, colB, null as colC, null as colD 
FROM table1 
UNION 
SELECT id, colA, colB, colC, null as ColD 
FROM table2 
UNION 
SELECT id, colA, colB, null as colC, cold 
FROM table3 
相關問題