我需要根据公共主键加入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;
非常感谢任何帮助
答案 0 :(得分:4)
SQLite中两个表A
和B
之间的完全外连接的一般构造确实是:
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
用于Socks
和Caps
之间的完整外部联接:
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
对Pants
和Boxers
执行相同操作。
然后像表一样对待这些视图,并使用相同的结构进行完整的外连接:
SELECT ... FROM SocksCaps LEFT JOIN PantsBoxers ON ...
UNION ALL
SELECT ... FROM PantsBoxers LEFT JOIN SocksCaps ON ... WHERE SocksCaps.color IS NULL