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 三个表保持不重叠的空值的主要内容,如果未能解决你的问题,请参考以下文章

如何使一个 div 中的三个表在调整大小时不重叠?

SQL触发器用INSERT上的当前日期替换表中的空值?

用于检查整个表的空值的 Bigquery SQL 函数

如何通过 C# 将可空整数列的空值插入 SQL 表

PL/SQL查询中的空值问题

保持固定菜单栏不重叠