完全外部加入4个表的sqlite

时间:2012-10-06 10:47:14

标签: sqlite full-outer-join

我需要根据公共主键加入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完全连接实现了左连接和联合alls:

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 个答案:

答案 0 :(得分:4)

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