Объединение двух таблиц с разным количеством столбцов

77 Jack Kada [2010-02-22 12:33:00]

У меня есть две таблицы (таблица A и таблица B).

У них разное количество столбцов - скажем, в таблице A больше столбцов.

Как можно объединить эти две таблицы и получить значение NULL для столбцов, которых нет в таблице B?

sql mysql


4 ответа


155 Решение Kangkan [2010-02-22 12:35:00]

Добавьте дополнительные столбцы как null для таблицы с меньшим количеством столбцов, например

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2

6 Anand Varkey Philips [2016-11-23 12:54:00]

Я пришел сюда и последовал за ним. Но несоответствие в типе "Порядок данных" вызвало ошибку. Ниже приведено описание из другого ответа.

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

create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);

create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);

select * from test1_1790
union all
select * from test2_1790;

ORA-01790: выражение должно иметь тот же тип данных, что и соответствующее выражение

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

выберите col_a, col_b, col_c из test1_1790 союз все выберите col_a, col_b, col_c из test2_1790; Более частым сценарием для этой ошибки является случай, когда вы случайно поменяли (или сдвинули) два или более столбца в списке SELECT:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

ИЛИ если вышеуказанное не решит вашу проблему, как насчет создания ALIAS в столбцах, подобных этому: (запрос не совпадает с вашим, но в данном случае речь идет о том, как добавить псевдоним в столбец.)

SELECT id_table_a, 
       desc_table_a, 
       table_b.id_user as iUserID, 
       table_c.field as iField
UNION
SELECT id_table_a, 
       desc_table_a, 
       table_c.id_user as iUserID, 
       table_c.field as iField

0 Lukasz Szozda [2018-09-26 21:54:00]

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

В SAS SQL есть специальный оператор для обработки этого сценария:

Руководство пользователя процедуры SAS (R) 9.3 SQL

КОРРЕСПОНДИНГ (CORR) Ключевое слово

Ключевое слово CORRESPONDING используется только тогда, когда указан оператор set. CORR заставляет PROC SQL сопоставлять столбцы в табличных выражениях по имени, а не по порядковому положению. Столбцы, которые не совпадают по имени, исключаются из таблицы результатов, за исключением оператора OUTER UNION.

SELECT * FROM tabA
OUTER UNION CORR
SELECT * FROM tabB;

За:

+---+---+
| a | b |
+---+---+
| 1 | X |
| 2 | Y |
+---+---+

OUTER UNION CORR

+---+---+
| b | d |
+---+---+
| U | 1 |
+---+---+

<=>

+----+----+---+
| a  | b  | d |
+----+----+---+
|  1 | X  |   |
|  2 | Y  |   |
|    | U  | 1 |
+----+----+---+

U-SQL поддерживает похожую концепцию:

ВНЕШНИЙ СОЮЗ ПО НАИМЕНОВАНИЮ (*)

ВНЕШНИЙ

требуется предложение BY NAME и список ON. В отличие от других выражений набора, схема вывода OUTER UNION включает в себя как совпадающие столбцы, так и несовпадающие столбцы с обеих сторон. Это создает ситуацию, когда в каждой строке, приходящей с одной из сторон, есть "пропущенные столбцы", которые присутствуют только на другой стороне. Для таких столбцов значения по умолчанию предоставляются для "отсутствующих ячеек". Значения по умолчанию равны нулю для типов, допускающих значение NULL, и значения по умолчанию .Net для типов, не допускающих значения NULL (например, 0 для типа int).

ПО ИМЕНИ

требуется при использовании с OUTER. Предложение указывает, что объединение сопоставляет значения не на основе позиции, а по имени столбцов. Если предложение BY NAME не указано, сопоставление выполняется позиционно.

Если предложение ON содержит символ "*" (он может быть указан как последний или единственный элемент списка), тогда допускаются дополнительные совпадения имен, помимо тех, которые указаны в предложении ON, а столбцы результатов включают все соответствующие столбцы в Порядок их присутствия в левом аргументе.

И код:

@result =    
    SELECT * FROM @left
    OUTER UNION BY NAME ON (*) 
    SELECT * FROM @right;

0 Sai Sai [2017-09-26 06:42:00]

если только 1 строка, вы можете использовать join

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;