SQL Join 三个表保持不重叠的空值
Posted
技术标签:
【中文标题】SQL Join 三个表保持不重叠的空值【英文标题】:SQL Join three tables keep non-overlapping null values 【发布时间】:2017-07-19 02:31:07 【问题描述】:我基本上在数据库中有 2 个表,还有一个日期表,我认为我需要将它们连接在一起才能达到预期的效果。
美食
date | foos
------------------
2016-01-01 2
2016-01-02 3
2016-01-03 4
条形
date | bars
------------------
2016-01-02 9
2016-01-03 8
2016-01-04 7
日期
dates
----------
2016-01-01
2016-01-02
2016-01-03
2016-01-04
...
想要的返回值
date | bars | foos
-------------------------
2016-01-01 Null 2
2016-01-02 9 3
2016-01-03 8 4
2016-01-04 7 Null
我目前正在做的是选择我的日期表,然后左加入 foos 到日期,然后左加入条到日期。
问题是这给了我以下结果
date | bars | foos
-------------------------
2016-01-01 Null 2
2016-01-02 9 3
2016-01-03 8 4
2016-01-04 7 Null
2016-01-05 Null Null
2016-01-06 Null Null
2016-01-07 Null Null
...
如果 bar 和 foos 都为空,我不希望返回日期。我可以让它以这种方式呈现,但我不确定这是最有效的选择方式,即:
where (bars is not null or foos is not null)
【问题讨论】:
那么您的实际问题是什么?在我看来,您的最后一行代码就是解决方案。 我想我想问一下这是否是执行此操作的最有效方法 如果你试一下,会不会出现性能问题?通常最好在确实存在问题时修复性能,如果不是,则不必修复它。 你正在做的很好......你也可以使用子查询来达到同样的效果......但是性能总是取决于表和数据的大小...... 【参考方案1】:用left outer join
试试这个
select d.dates,b.bars,f.foos from dates d
left outer join bars b on d.dates = b.date
left outer join foos f on d.dates = f.date;
+------------+------+------+
| dates | bars | foos |
+------------+------+------+
| 2016-01-02 | 9 | 3 |
| 2016-01-03 | 8 | 4 |
| 2016-01-04 | 7 | NULL |
| 2016-01-01 | NULL | 2 |
+------------+------+------+
【讨论】:
【参考方案2】:对于这个查询,使用以下似乎已经足够了。
where (bars is not null or foos is not null)
【讨论】:
以上是关于SQL Join 三个表保持不重叠的空值的主要内容,如果未能解决你的问题,请参考以下文章