2012-10-06 28 views
3

我需要基於一個公共主鍵聯接4個表。如果sqlite實現完全外連接,它可能看起來像這樣(不考慮優化)。完全外部加入在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的FULL JOIN左聯接和工會承滴盤實現:

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; 

任何幫助非常感謝

回答

3

的全外的一般建設兩個表AB SQLite中的確是之間的連接:

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

現在create a viewSocksCaps爲全外連接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