sql填充常量,以防连接两个表时不匹配

eh57zj3b  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(296)

假设我有一张table:

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

我们称之为表1
还有一张table:

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

我们称之为表2
如何达到这样的输出:

+--------+-----------+----------+
|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。
似乎是一个很简单的问题,但我尝试了各种连接,如全外,左外,右外,但我不能完成我想要的。在此方面的任何帮助都将不胜感激。
我试图在sparksql中实现这一点,但是我认为这个问题是一个一般的sql问题。

46scxncf

46scxncf1#

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

相关问题