如果右侧表中不存在日期,则使用 LEFT JOIN 返回 NULL

Posted

技术标签:

【中文标题】如果右侧表中不存在日期,则使用 LEFT JOIN 返回 NULL【英文标题】:Return NULL if date is not exists in right side table using LEFT JOIN 【发布时间】:2020-03-10 17:08:21 【问题描述】:

我有 2 张桌子 表一:M1

----------------------------------------------------------------------------
propertyId                              productId
----------------------------------------------------------------------------
041E09A8-BB30-4555-91AC-E366AFD4DD79    B20D2D1E-C6D2-4821-B58D-B031E737B732
E46F20AC-9AF7-43BB-AC06-79BF61C8E8B1    B20D2D1E-C6D2-4821-B58D-B031E737B732

表 2:M2

------------------------------------------------------------
propertyId                             startdate    volume
------------------------------------------------------------
041E09A8-BB30-4555-91AC-E366AFD4DD79    2019-06-20     5
E46F20AC-9AF7-43BB-AC06-79BF61C8E8B1    2019-06-20    10
041E09A8-BB30-4555-91AC-E366AFD4DD79    2019-06-21    15

预期的输出应该是这样的(即使该期间不存在“propertyid”也应该返回空)

--------------------------------------------------------------------
propertyId                             startdate    volume
--------------------------------------------------------------------
041E09A8-BB30-4555-91AC-E366AFD4DD79    2019-06-20      5
E46F20AC-9AF7-43BB-AC06-79BF61C8E8B1    2019-06-20     10
041E09A8-BB30-4555-91AC-E366AFD4DD79    2019-06-21     15
E46F20AC-9AF7-43BB-AC06-79BF61C8E8B1    NULL           NULL

这里的 propertyid 'E46F20AC-9AF7-43BB-AC06-79BF61C8E8B1' 没有日期 '2019-06-21' 的记录。 你能帮帮我吗?

【问题讨论】:

首先弄清楚您使用的是哪个 RDBMS。然后查看:Why should I provide an MCRE for what seems to me to be a very simple SQL query?。请注意,对于我们人类来说,“9AF7”比“E46F20AC-9AF7-43BB-AC06-79BF61C8E8B1”更容易理解——而不会失去问题的任何意义。 您为什么要为 为 2019 年 6 月 21 日的日期“制造”一行,但不在“制造”行中包含该日期?如果有更多的日期和更多的“缺失”行会发生什么? 【参考方案1】:

这看起来像 cross join 来生成行,然后是 left join 来引入值:

select m1.propertyid, d.startdate, m2.volume
from m1 cross join
     (select distinct startdate from m2) d left join
     m2
     on m2.startdate = d.startdate and m2.propertyid = m1.propertyid

【讨论】:

以上是关于如果右侧表中不存在日期,则使用 LEFT JOIN 返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

LEFT JOIN,如果存在第二个表的结果,则添加到 PHP 中的数组

SQL SERVER LEFT JOIN, INNER JOIN, RIGHT JOIN

MS Access / SQL Server JOIN返回左表中的所有值,如果右侧缺少则返回零

通过 LEFT JOIN 优化 SQL 子查询

如果表中不存在新的帖子标签,则存储它?

如果其他表中不存在 id,则获取不同的行并使用合并