Join
如何從由記錄標識符連接的 3 個表中檢索數據?
我有 3 張桌子。
WHERE
我需要使用特定條件檢查這些表中是否存在特定標識符。我需要從所有 3 個表中獲取數據。我試過了
LEFT JOIN
,RIGHT JOIN
但FULL 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
並且您必須使用記錄數設置表