Об’єднання двох таблиць з різною кількістю стовпців


106

У мене дві таблиці (Таблиця A і Таблиця B).

Вони мають різну кількість стовпців - Скажімо, таблиця A містить більше стовпців.

Як я можу об'єднати ці дві таблиці та отримати нульове значення для стовпців, у яких немає таблиці B?

Відповіді:


215

Додайте додаткові стовпці як нульові для таблиці, що має менше стовпців

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

6
Чи є спосіб заповнити значення за замовчуванням для стовпця Null?
Ганс

3
@Hans: Ви можете зробити щось на зразок isnull (ColumnName, 0) як ColumnName або isnull (ColumnName, '-') як ColumnName або щось подібне.
Кангкан

3
Я зрозумів, що це рішення також працює без перерахування всіх стовпців. Таким чином , замість того Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2, можна також зробити, Select *, Null as Col4, Null as Col5 from Table2.
Pratik Patel

Для нульового значення для мене працював цей хак: 'SomeString' як DummyColumn. В основному, ви просто замінюєте NULL деяким значенням. Це також спрацювало при використанні з groupby.
Саурах Джайн

8

Я прийшов сюди і пішов вище за відповідь. Але невідповідність типу даних "Порядок" спричинила помилку. Опис нижче з іншої відповіді стане корисним.

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

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;

АБО якщо вищезгадане не вирішує вашу проблему, як щодо створення АЛІАС у таких стовпцях: (запит не такий, як ваш, але справа тут у тому, як додати псевдонім у стовпчик.)

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

Мені довелося використовувати те саме, але я додав a.col_name та b.col_name для стовпців, що не мають нуля. Для нульових стовпців мені довелося використовувати: NULL AS col_name1, NULL AS col_name2 тощо
Скотт R

1
Примітка SELECT * UNION можна прикувати декілька разів; зверніть увагу, де фільтри можна використовувати в кожному пункті SELECT
mirekphd

1

Зазвичай вам потрібно мати однакову кількість стовпців, коли ви використовуєте встановлені оператори, щоб відповідь Канкана була правильною.

SAS SQL має конкретного оператора для обробки цього сценарію:

SAS (R) 9.3 Посібник користувача для процедури SQL

CORRESPONDING (CORR) Ключове слово

Ключове слово CORRESPONDING використовується лише тоді, коли вказаний оператор набору. 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 включає як відповідні стовпці, так і невідповідні стовпці з обох сторін. Це створює ситуацію, коли кожен рядок, що йде з однієї зі сторін, має "відсутні колонки", які є лише з іншого боку. Для таких стовпців задаються значення за замовчуванням для "відсутніх комірок". Значення за замовчуванням є нульовими для змінних типів, а значення NET - для нетлібних типів (наприклад, 0 для int).

ВІД ІМ’Я

потрібно використовувати при використанні OUTER. Пункт вказує, що об'єднання співставляє значення не на основі позиції, а назви стовпців. Якщо пункт BY NAME не вказаний, відповідність проводиться позиційно.

Якщо пункт ON містить символ «*» (він може бути вказаний як останній або єдиний член списку), то додаткові імена збігаються за тими, що містяться в пункті ON, і стовпці результату містять усі відповідні стовпці в порядку вони присутні в аргументі зліва.

І код:

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

Редагувати:

Концепція зовнішнього об'єднання підтримується KQL :

вид:

внутрішній - В результаті є підмножина стовпців, спільна для всіх вхідних таблиць.

зовнішній - Результат містить усі стовпці, що знаходяться на будь-якому з входів. Осередки, які не були визначені вхідним рядком, встановлюються на нуль.

Приклад:

let t1 = datatable(col1:long, col2:string)  
[1, "a",  
2, "b",
3, "c"];
let t2 = datatable(col3:long)
[1,3];
t1 | union kind=outer t2;

Вихід:

+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    1 | a    |      |
|    2 | b    |      |
|    3 | c    |      |
|      |      |    1 |
|      |      |    3 |
+------+------+------+

демонстрація


Будь-яка ідея, як досягти цього в SQL ??
KetanVaghasiya

@KetanVaghasiya Наскільки я знаю, лише SAS SQL і U-SQL підтримують цю концепцію.
Лукаш Шозда

-1

якщо лише 1 ряд, ви можете використовувати приєднання

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

Об’єднання двох однорядних таблиць (два мультисезонні відносини, кожний з одним кортежем) матиме два рядки (кортежі) у отриманому відношенні. У реляційній алгебрі (якої SQL немає) результатом об'єднання може бути один рядок, хоча лише у тому випадку, якщо два відносини введення містять однаковий кортеж, наприклад. самооб’єднання односкладного відношення.
Роберт Монфера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.