SQL填充常量,如果在连接两个表时没有匹配项

时间:2018-10-11 01:12:44

标签: mysql sql apache-spark apache-spark-sql

说我有一张桌子:

+--------+-----------+----------+
|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         |
+--------+-----------+----------+

本质上,如果将table1与table2连接时没有匹配项,则必须在位置加上0。

似乎是一个非常简单的问题,但是我尝试了各种连接,例如full_outer,left_outer,right_outer,但是,我无法完成我想要的工作。在这方面的任何帮助将不胜感激。

我正在尝试在Spark sql中执行此操作,但是我认为此问题是一般的sql问题。

1 个答案:

答案 0 :(得分:0)

使用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;