SQL 填充常量以防万一连接两个表时不匹配

Posted

技术标签:

【中文标题】SQL 填充常量以防万一连接两个表时不匹配【英文标题】:SQL Fill Constants Incase there is no match in joining two tables 【发布时间】:2018-10-11 01:12:43 【问题描述】:

假设我有一张桌子:

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

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

【讨论】:

谢谢...正是我想要的:)

以上是关于SQL 填充常量以防万一连接两个表时不匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用不匹配的外键连接两个表时的空结果集

SQL - 连接两个表时无法执行不同的计数

连接两个以上的表时,Oracle 连接消除无法按预期工作

存在匹配时排除不匹配行的 SQL 多对多连接

在连接两个表时获得R中的加权平均值

web.config 中到一个 SQL DB 的两个连接字符串在调试中工作,但在发布时不工作