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



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



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



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

881   4  

4 ответов:

добавить дополнительные столбцы как null для таблицы, имеющей меньше столбцов, таких как

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

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

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

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 col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

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

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

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

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

обычно вам нужно иметь одинаковое количество столбцов, когда вы используете операторы на основе набора, поэтому Kangkan это!--5--> является правильным.

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

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

соответствующее (CORR) Ключевое слово

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

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 поддерживает аналогичную концепцию:

ВНЕШНЕЕ СОЕДИНЕНИЕ ПО ИМЕНИ ON (*)

внешний

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

BY Имя

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

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

и код:

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

Comments

    Ничего не найдено.