Join

如何從由記錄標識符連接的 3 個表中檢索數據?

  • October 31, 2018

我有 3 張桌子。

WHERE我需要使用特定條件檢查這些表中是否存在特定標識符。我需要從所有 3 個表中獲取數據。

我試過了LEFT JOINRIGHT JOINFULL OUTER JOIN我無法得到中間表的值。

我的查詢嘗試是:

Select t1.col1, t2.col2, t3.col3
from t1
left outer join t2
on t1.id=t2.id
full outer join t3
on t1.id=t3.id
where t.id= '101';

我無法獲得僅存在於 t2 表中的值。

我假設 ID 列是 PK 或在所有三個表中聲明為唯一的。

現在,如果這些場景中的每一個都同樣可能:

  • 所有三個表都有一行 ID 為 101,
  • 三個表中只有兩個(任意兩個)有一行 ID 為 101,
  • 三個表中只有一個(任意一個)有一行 ID 為 101,

並且您希望從每個具有匹配項的表中獲取請求的數據——那麼您只需要使用完全連接。

這是實現請求的一種方式:

SELECT
 t1.Col AS t1Col,
 t2.Col AS t2Col,
 t3.Col AS t3Col
FROM
 t1
 FULL JOIN t2 ON t1.ID = t2.ID
 FULL JOIN t3 ON COALESCE(t1.ID, t2.ID) = t3.ID
WHERE
 COALESCE(t1.ID, t2.ID, t3.ID) = 101
;

如您所見,當只有一個表匹配時,為了將第三個表的 ID 與其他兩個表的 ID 匹配,您可以使用 COALESCE 函式。COALESCE 將選擇兩個指定的非空(非空)ID,從而確保第三個 ID 將與任一表中的現有行匹配。如果兩個表中都存在匹配項,則相同的條件將正常工作。

WHERE 條件使用類似的技術來過濾結果集。由於連接集的每一行中的每個表的 ID 都應該是相同的值或空值,因此 COALESCE 函式必須選擇一個非空值來與指定的參數 (101) 進行比較。因此,只有三個表中的所有或任何一個具有匹配數據的行才會被選中。

您還可以採取稍微不同的方法:分別ID = 101從每個表中選擇與條件匹配的行,將結果用作派生表,然後將它們連接起來:

SELECT
 t1.Col AS t1Col,
 t2.Col AS t2Col,
 t3.Col AS t3Col
FROM
 (
   SELECT ID, Col FROM t1 WHERE ID = 101
 ) AS t1
 FULL JOIN
 (
   SELECT ID, Col FROM t2 WHERE ID = 101
 ) AS t2 ON t1.ID = t2.ID
 FULL JOIN
 (
   SELECT ID, Col FROM t3 WHERE ID = 101
 ) AS t3 ON COALESCE(t1.ID, t2.ID) = t3.ID
;

儘管您現在必須重複相同的過濾條件,但結果查詢可能會變得更有效——這將取決於查詢優化器在您的數據庫系統中的智能程度。

測試這兩個查詢以確定哪個更適合您。

猜猜你必須檢索哪個表的記錄最多,然後從那個表開始你的 JOIN 並使用 LEFT JOIN 或者你可以做相反的事情(搜尋記錄最少的表)並使用 RIGHT JOIN

並且您必須使用記錄數設置表

引用自:https://dba.stackexchange.com/questions/136433