如何在 MySQL 中进行 FULL OUTER JOIN?

新手上路,请多包涵

我想在 MySQL 中进行 [完全外部](https://en.wikipedia.org/wiki/Join(SQL)#Full_outerjoin) 联接。这可能吗? MySQL 是否支持 _完全外连接_?

原文由 Spencer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 548
2 个回答

您在 MySQL 中没有 _完全连接_,但您可以肯定地 模拟它们

对于从 这个 Stack Overflow 问题 转录的代码 _示例_,您有:

有两个表 t1, t2:

 SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id


上面的查询适用于 完全外连接 操作不会产生任何重复行的特殊情况。上面的查询依赖于 UNION 集合运算符来删除查询模式引入的重复行。我们可以通过对第二个查询使用 反连接 模式来避免引入重复行,然后使用 UNION ALL 集合运算符来组合这两个集合。在更一般的情况下,完全外连接会返回重复的行,我们可以这样做:

 SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL

原文由 Pablo Santa Cruz 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以只转换完整的外部联接,例如

SELECT fields
FROM firsttable
FULL OUTER JOIN secondtable ON joincondition

进入:

 SELECT fields
FROM firsttable
LEFT JOIN secondtable ON joincondition
UNION ALL
SELECT fields (replacing any fields from firsttable with NULL)
FROM secondtable
WHERE NOT EXISTS (SELECT 1 FROM firsttable WHERE joincondition)

或者,如果您至少有一列,例如 foo ,在 firsttable 中不为空,您可以执行以下操作:

 SELECT fields
FROM firsttable
LEFT JOIN secondtable ON joincondition
UNION ALL
SELECT fields
FROM firsttable
RIGHT JOIN secondtable ON joincondition
WHERE firsttable.foo IS NULL

原文由 ysth 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题