Как объединить два столбца в кадре данных, запустив как левое, так и правое внешнее соединение - PullRequest
0 голосов
/ 10 марта 2020

У меня есть две таблицы с 2 столбцами в каждой, один столбец идентификатора и один столбец дохода. Я объединил обе таблицы, используя полное внешнее соединение, выполнив следующее:

val income = incomeA.join(incomeB, incomeA("idA") === incomeB("idB"), "full")

, в результате чего был получен следующий набор:

+--------------------+----------+--------------------+----------+ 
|  idA               |  A_INCOME|  idB               |  B_INCOME|
+--------------------+----------+--------------------+----------+
|0d4f671c-552b-449...|      2250|                null|      null|
|9e03f92e-af0e-416...|      1250|                null|      null|
|                null|      null|c75d0d17-f3c1-497...|      4300|
|02572d79-bc54-427...|      2880|                null|      null|
|                null|      null|ca493eca-0709-4db...|      2320|
|cb7831ac-2550-435...|      1650|                null|      null|
|da7ac4c4-403b-466...|      2250|                null|      null|
|9bddb7b5-0047-4e1...|      5170|                null|      null|
|                null|      null|b54fc648-5f00-411...|       800|
|7aeade0a-47d4-459...|      4250|                null|      null|
|4fde8deb-a7de-45a...|      1650|                null|      null|
+--------------------+----------+--------------------+----------+

Но вместо вышесказанного мне бы хотелось получить окончательный вариант результат содержит 3 столбца, один столбец id с idA и idB и два столбца дохода, например:

+--------------------+----------+----------+ 
|  id                |  A_INCOME|  B_INCOME|
+--------------------+----------+----------+
|0d4f671c-552b-449...|      2250|      null|
|9e03f92e-af0e-416...|      1250|      null|
|c75d0d17-f3c1-497...|      null|      4300|
|02572d79-bc54-427...|      2880|      null|
|ca493eca-0709-4db...|      null|      2320|
|cb7831ac-2550-435...|      1650|      null|
|da7ac4c4-403b-466...|      2250|      null|
|9bddb7b5-0047-4e1...|      5170|      null|
|b54fc648-5f00-411...|      null|       800|
|7aeade0a-47d4-459...|      4250|      null|
|4fde8deb-a7de-45a...|      1650|      null|
+--------------------+----------+----------+

Эта таблица должна быть как результатом выполнения полного левого соединения, так и Полное право на этом кадре данных. Есть ли способ добиться этого? Как бы вы подошли к этому? Большое спасибо заранее!

1 Ответ

2 голосов
/ 10 марта 2020

Я думаю, вы просто хотите coalesce():

select coalesce(a.id, b.id) as id, a.income as a_income, b.income a b_income
from a full join
     b
     on a.id = b.id;

Большинство баз данных поддерживают стандартный синтаксис USING, поэтому вы также можете использовать:

select id, a.income as a_income, b.income a b_income
from a full join
     b
     using (id);
...