完全外部加入 mySQL - 缺少行

Posted

技术标签:

【中文标题】完全外部加入 mySQL - 缺少行【英文标题】:Full outer Join mySQL - missing rows 【发布时间】:2016-01-03 16:47:39 【问题描述】:

我正在尝试通过使用左连接并将其与右连接联合来模拟 mysql 中的完全外连接。

SELECT * FROM auxview_candiNotes AS a
LEFT JOIN auxview_clientNotes AS b ON a.dateAdded = b.dateAdded
UNION
SELECT * FROM auxview_candiNotes AS a
RIGHT JOIN auxview_clientNotes AS b ON a.dateAdded = b.dateAdded

我这样做的原因是因为我要加入两个表,有时其中一个表在特定日期没有值(因此表中未列出该日期)。但是,连接表应显示出现在一个或两个表中的所有日期。如果其中一个表不包含特定日期的值,则应返回 NULL。

但是,auxview_clientNotes 表中的某些日期未列在连接表中。

提前致谢!

【问题讨论】:

嗨瑞恩,感谢您的回复。我已经分别尝试了两个外部连接,它们似乎工作得很好。仅当我使用联合将其放入一张表时才会出现问题。这就是我现在感到困惑的地方...... 谢谢 Ryan,你说的查询 ID 是什么? 我在这里建立了一个模式:sqlfiddle.com/#!9/027ee - 但是这个工作得很好,而我的数据集似乎不起作用...... 我正在寻找的确切输出是一个包含两个表中所有日期和值的表 - 现在这个连接表缺少一些值。我现在将尝试更多调试,因为 SO 要求我避免在 cmets 中进行扩展讨论。 【参考方案1】:

此方法不完全是完全外连接,因为union 删除了重复项。当基础表有重复时,可能会生成重复。通常,重复删除被认为是一个“好”的想法,但该方法并不完全等同于 full outer join

我更喜欢left join 方法:

select candi.*, client.*
from (select dateAdded from auxview_candiNotes union -- intentionally not `union all`
      select dateAdded from auxview_clientNotes
     ) d left join
     auxview_candiNotes candi
     on candi.dateAdded = d.dateAdded left join
     auxview_clientNotes client
     on client.dateAdded = d.dateAdded;

【讨论】:

晚上好,戈登,非常感谢您抽出宝贵时间!不幸的是,如果日期存在于“右”表(即 clientNotes)中但不存在于左表中,那么您的查询仍然存在一些缺失值。 @5h3z4n 。 . .编辑您的问题并提供示例数据。这应该返回所有日期和相关记录。

以上是关于完全外部加入 mySQL - 缺少行的主要内容,如果未能解决你的问题,请参考以下文章

为啥当缺少连接字段之一时,HIVE 中的完全外部连接会给出奇怪的结果?

完全外部自我加入不同日期的数据

完全外部联接SQL Server

AWS 文档说合并连接可用于外部连接,但不能用于完全连接。这些是一样的吗?

mysql删除完全重复行,求教

mysql之 innobackupex备份+binlog日志的完全恢复(命令行执行模式)