Как объединить несколько таблиц, которые немного различаются по столбцам

У меня есть несколько таблиц, в которых примерно 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 будут иметь значения NULL для colC и colD в allTables, все строки из table2 будут иметь нулевые значения для colD, а все строки из table3 будут иметь нулевые значения в colC.

Пара заметок:

  • Идентификатор столбца не совпадает или никак не связан между таблицами
  • В моем примере показаны 3 таблицы, но у меня их около 8-9.
  • В каждой исходной таблице существуют повторяющиеся строки, и их следует сохранить.

В частности, меня интересует, есть ли ответ, аналогичный тому, который получил наибольшее количество голосов здесь или что-то в этом роде более общего характера.


person mindless.panda    schedule 19.07.2011    source источник


Ответы (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

Поскольку идентификаторы не связаны, вы также можете отслеживать, из какой таблицы была получена строка, на случай, если между таблицами есть дубликаты. Для этого просто укажите жестко запрограммированное значение с псевдонимом с другим значением в каждом из трех операторов SELECT.

person Tom H    schedule 19.07.2011
comment
В вашей последней части есть ColC, а его нет. - person Jacob; 19.07.2011

Вы можете попробовать это:

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
person bobs    schedule 19.07.2011

Вы можете использовать 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;

Как обсуждалось в комментариях, вы можете изменить это с помощью _3 _ / _ 4_, если хотите удалить дубликаты из разных таблиц. Спасибо комментаторам.

person Kerrek SB    schedule 19.07.2011
comment
Возможно, вам будет лучше с UNION ALL. В противном случае я получил свой голос. - person bobs; 19.07.2011
comment
UNION потеряет все повторяющиеся строки. В вопросе не уточняется, нормально это или нет, но на это следует указать. - person Tom H; 19.07.2011

Вам понадобится 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
person phlogratos    schedule 19.07.2011