[英]MySQL: Expressing full joins with two tables having foreign keys to a common base table
假設我們需要在表1-3上執行兩個FULL JOIN
(以PostgreSQL術語)的查詢,其中表2和表3都具有指向表1的外鍵。 這將在MySQL中起作用,而FULL JOIN
不可用。 因此,必須找到一種解決方法。
從LEFT JOIN
s開始,以下代碼如(1)中所述工作 :
SELECT table1.ID, table1.x, table2.y, table3.z
FROM (table1
LEFT JOIN table2
ON table1.ID = table2.FOREIGN_ID)
LEFT JOIN table3
ON table1.ID = table3.FOREIGN_ID
在(2)之后 ,我可以使用UNION
語句為單個UNION
模擬完整的外部UNION
:
SELECT table1.ID, table1.x, table2.y
FROM table1
LEFT JOIN table2
ON table1.ID = table2.FOREIGN_ID
UNION
SELECT table1.ID, table1.x, table2.y
FROM table1
RIGHT JOIN table2
ON table1.ID = table2.FOREIGN_ID
生產
和
SELECT table1.ID, table1.x, table3.z
FROM table1
LEFT JOIN table3
ON table1.ID = table3.FOREIGN_ID
UNION
SELECT table1.ID, table1.x, table3.z
FROM table1
RIGHT JOIN table3
ON table1.ID = table3.FOREIGN_ID
ORDER BY ID
生產
我需要有關如何從此處獲取此輸出的建議:
也就是說,通過外鍵引用來自table1的條目的結果行應合理地合並,而來自table2和table3的雜散條目(外鍵為NULL的那些條目)應在額外的行中列出(在示例中為y2和z4) 。
事實證明,在PostgreSQL中這將是一個簡單的兩步式FULL JOIN
:
SELECT table1.id, table1.x, table2.y, table3.z
FROM table1
FULL JOIN table2
ON table2.Foreign_Id = table1.id
FULL JOIN table3
ON table3.Foreign_Id = table1.id
ORDER BY table1.id, table2.id, table3.id;
從freenode #sql向大家大聲疾呼,指出這個等效的MySQL查詢,避免使用FULL JOIN
:
SELECT id1, x, y, z FROM (
SELECT table1.id as id1, table1.x, table2.id as id2, table2.y, table3.id as id3, table3.z
FROM table1
LEFT JOIN table2
ON table2.Foreign_Id = table1.id
LEFT JOIN table3
ON table3.Foreign_Id = table1.id
UNION ALL
SELECT NULL, NULL, table2.id, table2.y, NULL, NULL
FROM table2 WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE table1.id = table2.Foreign_Id)
UNION ALL
SELECT NULL, NULL, NULL, NULL, table3.id, table3.z
FROM table3 WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE table1.id = table3.Foreign_Id)
ORDER BY id1, id2, id3 ) AS T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.