如何组合列中略有不同的多个表

时间:2011-07-19 17:04:11

标签: sql join union

我有多个表,其中大约有10个常用列,但有些表有1-2个额外的列。

我想将所有这些表组合成一个表,每个表的每一行都有一行,每个特定行的源表中不存在任何列的NULL值。

所以我的输入看起来大致如下:

table1
id  |  colA  | colB

table2
id  |  colA  | colB  | colC

table3
id  |  colA  | colB  | colD

我正试图解决这个问题:

allTables
id  |  colA  | colB  | colC | colD

在上面的例子中,table1中的所有行在allTables中都有colC和colD的NULL值,table2中的所有行都有colD的空值,而table3中的所有行在colC中都有空值。

一对夫妇注意到:

  • 以任何方式列表之间的列ID不相同或相关
  • 我的示例显示了3个表,但我有大约8-9个。
  • 每个源表中都存在重复的行,应该保留。

特别是我感兴趣的是,有一个答案类似于最高投票的here或类似的更广泛的答案。

4 个答案:

答案 0 :(得分: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语句中使用带有别名的硬编码值。

答案 1 :(得分: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对此进行更改。感谢评论者。

答案 2 :(得分: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

答案 3 :(得分: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