SQL Fill Constants Incase нет совпадения в соединении двух таблиц - PullRequest
0 голосов
/ 11 октября 2018

Скажем, у меня есть таблица:

+--------+-----------+----------+
|style_id|SegmentName|StyleViews|
+--------+-----------+----------+
|1       |Z          |1         |
|1       |X          |2         |
|2       |Z          |1         |
|1       |Y          |2         |
|3       |Y          |1         |
|3       |X          |1         |
+--------+-----------+----------+

Давайте назовем это table1

и еще одна таблица:

+-----------+
|allsegments|
+-----------+
|X          |
|Y          |
|Z          |
+-----------+

Давайте назовем это table2

Как мне получить на выходе что-то вроде этого:

+--------+-----------+----------+
|style_id|SegmentName|StyleViews|
+--------+-----------+----------+
|1       |X          |2         |
|1       |Y          |2         |
|1       |Z          |1         |
|2       |X          |0         |
|2       |Y          |0         |
|2       |Z          |1         |
|3       |X          |1         |
|3       |Y          |1         |
|3       |Z          |0         |
+--------+-----------+----------+

По сути, если нет совпадения, когда таблица1 соединена с таблицей2, она добавляет 0 на месте.

Похоже, довольно простая проблема, однако я пробовал все виды объединений, такие как full_outer, left_outer, right_outer, однако я не могу выполнить то, что хочу.Буду признателен за любую помощь в этом отношении.

Я пытаюсь сделать это в Spark SQL, однако я думаю, что эта проблема является общей проблемой SQL.

1 Ответ

0 голосов
/ 11 октября 2018

Используйте cross join для генерации строк и left join для ввода значений:

select s.style_id, se.segmentname, coalesce(styleviews, 0) as styleviews
from (select distinct style_id from table1) s cross join
     allsegments se left join
     table1 t
     on t.style_id = s.style_id and
        t.segmentname = se.segmentname;
...