在 4 个表上的 sqlite 中完全外连接

Posted

技术标签:

【中文标题】在 4 个表上的 sqlite 中完全外连接【英文标题】:Full Outer Join in sqlite on 4 tables 【发布时间】:2012-09-27 08:49:12 【问题描述】:

我需要基于一个共同的主键连接 4 个表。如果 sqlite 实现了完整的外连接,它可能看起来像这样(不考虑优化)。

SELECT S.pair, C.ball, P.bluejeans, B.checkered 
FROM Socks S 
FULL OUTER JOIN Caps C 
FULL OUTER JOIN Pants P 
FULL OUTER JOIN Boxers B 
WHERE S.color = C.color AND S.color = P.color AND S.color = B.color;

我看了很长时间,发现最好的是这个 2 表 sqlite 完全连接,用左连接和联合所有实现:

SELECT employee.*, department.* 
FROM employee LEFT JOIN department 
ON employee.DepartmentID = department.DepartmentID 
UNION ALL SELECT employee.*, department.* 
FROM   department LEFT JOIN employee 
ON employee.DepartmentID = department.DepartmentID 
WHERE  employee.DepartmentID IS NULL;

我正在尝试修改它以使其适用于 2 个以上的表,但我是 SQL 新手,我并没有走得太远。是否有可能在合理的时间内得到这个结果?

我认为我对 3 个表有正确的实现(可能不正确),但我似乎仍然无法为 4 个表实现它。这是我对 3 个表的实现:

SELECT S.pair, C.ball, P.bluejeans 
FROM Socks S LEFT JOIN Caps C LEFT JOIN Pants P 
ON C.color = S.color AND P.color = S.color 
UNION ALL 
SELECT S.pair, C.ball, P.bluejeans 
FROM Socks S LEFT JOIN Caps C LEFT JOIN Pants P 
ON S.color = C.color AND S.color = P.color 
WHERE S.color IS NULL;

非常感谢任何帮助

【问题讨论】:

【参考方案1】:

在 SQLite 中两个表 AB 之间的完全外连接的一般构造确实是:

SELECT ... FROM A LEFT JOIN B ON ...
UNION ALL
SELECT ... FROM B LEFT JOIN A ON ... WHERE A.key IS NULL

现在create a view SocksCaps 用于SocksCaps 之间的完全外连接:

CREATE VIEW SocksCaps AS
SELECT ... FROM Socks LEFT JOIN Caps ON ...
UNION ALL
SELECT ... FROM Caps LEFT JOIN Socks ON ... WHERE Socks.color IS NULL

PantsBoxers 执行相同操作。

然后将这些视图视为表,并使用相同的结构进行完全外连接:

SELECT ... FROM SocksCaps LEFT JOIN PantsBoxers ON ...
UNION ALL
SELECT ... FROM PantsBoxers LEFT JOIN SocksCaps ON ... WHERE SocksCaps.color IS NULL

【讨论】:

以上是关于在 4 个表上的 sqlite 中完全外连接的主要内容,如果未能解决你的问题,请参考以下文章

索引视图中完全外连接的替代方案

ON 子句具有子查询的两个表上的右外连接

如何在连接表上的两个外键之间强制实施数据库约束?

哈希完全外连接如何工作?

左外连接 - 如何在第二个表中返回一个布尔值?

mySQL 中的完全外连接计数