Столбцы SQL Union NULL без явного перечисления имен столбцов - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть две таблицы, которые довольно широки (30 столбцов), но имеют очень схожую схему (более 20 столбцов совместно используются в обеих таблицах).Я хочу объединить эти две таблицы вместе, но хочу, чтобы в новой таблице были все поля из обеих таблиц.

Аналогично идее этого вопроса Stackoverflow .

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

Примерно так:

select
    commoncolumn1, 
    commoncolumn2, 
    table1_only_column1, 
    NULL as table2_only_column1
    ...
from table1
union all 
select
    commoncolumn1, 
    commoncolumn2, 
    NULL as table1_only_column1, 
    table2_only_column1
    ...

из таблицы 2

Этот запрос очень длинный, так как количество столбцов увеличивается, а также не совсем устойчив к изменениям схемы.Есть ли лучший способ объединения двух таблиц, которые автоматически заполняют NULL для несуществующих таблиц?

Я использую Impala / Hive, но если есть способ ANSI, это будет здорово!

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

FWIW, SQL UNION будет сопоставлять столбцы по порядковому номеру, а не по имени.Если имя столбца идентично в обоих SELECT, то это также имя столбца результата.Если нет, тогда имя столбца для результата будет «определено реализацией».

Смысл / следствие всего этого заключается в том, что вы должны остерегаться обоих порядок столбцов в ваших SELECTs , а также идентичное именование этих столбцов (если вы хотите, чтобы последующая ссылка на эти столбцы в результате UNION быламожно использовать имя вместо номера столбца).

Это то, что стандарт предписывает совместимым реализациям вести себя так, поэтому у вас очень мало шансов найти реализацию, которая может избавить вас от страданий, которые это вызывает для вас..

0 голосов
/ 25 апреля 2019

Из Википедия (выделено):

В SQL предложение UNION объединяет результаты двух запросов SQL в одну таблицу всех соответствующих строк.Два запроса должны привести к одинаковому количеству столбцов и совместимым типам данных для объединения.

Короче говоря, вы должны указать NULL для неприменимых столбцов,Вы можете написать что-нибудь для генерации SQL или использовать тот же столбец (с другим столбцом, указывающим, какой это атрибут), но вы ограничены.

Если вы не знакомы с Hive / Impala, возможно,Есть лучшие варианты.

Для чего стоит, вот справочная страница MySQL для UNION.Интересно, что в нем явно не указано, что требуется одинаковое количество столбцов (хотя это может быть только потому, что предполагается).

Как отмечает @AlexM, SELECT * может быть вариантом.Однако вы должны быть осторожны с этим, поскольку порядок столбцов может измениться, или могут быть добавлены новые столбцы, что может нарушить запрос UNION (стандартные предупреждения против использования SELECT *).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...