簡體   English   中英

MySQL:使用兩個表表達完全聯接,這些表具有指向公共基表的外鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM