首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 表連接實戰:LEFT/RIGHT/FULL JOIN 解決從表無資料導致主表列消失問題

     編輯:Oracle 教學

業務場景

查詢「所有人員及其訂單」,若用內連接或舊式 WHERE 連接,無訂單人員會被過濾掉。

測試資料

PersonsOrders
Id_PLastNameFirstNameCityId_OOrderNoId_P
1AdamsJohnLondon1778953
2BushGeorgeNew York2446783
3CarterThomasBeijing3224561
4245621
53476465

舊式 WHERE 連接(隱性內連接)


SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p, Orders o
WHERE p.Id_P = o.Id_P;

結果:Adams、Carter 各兩筆;Bush 完全消失(無匹配訂單)。

ANSI JOIN 語法對照

INNER JOIN(同 WHERE 連接)


SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p INNER JOIN Orders o ON p.Id_P = o.Id_P;

LEFT JOIN(保留左表所有人員)


SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p LEFT JOIN Orders o ON p.Id_P = o.Id_P
ORDER BY p.LastName;
LastNameFirstNameOrderNo
AdamsJohn77895
AdamsJohn44678
BushGeorgeNULL
CarterThomas22456
CarterThomas24562

Bush 保留,OrderNo 顯示 NULL — 完美解決主表資料遺失問題。

RIGHT JOIN(保留右表所有訂單)


SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p RIGHT JOIN Orders o ON p.Id_P = o.Id_P;
LastNameFirstNameOrderNo
AdamsJohn77895
AdamsJohn44678
CarterThomas22456
CarterThomas24562
NULLNULL34764

訂單 34764 對應 Person Id_P=65 不存在,人員欄位顯示 NULL。

FULL JOIN(雙邊全保留)


SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p FULL JOIN Orders o ON p.Id_P = o.Id_P;
LastNameFirstNameOrderNo
AdamsJohn77895
AdamsJohn44678
BushGeorgeNULL
CarterThomas22456
CarterThomas24562
NULLNULL34764

選擇建議

  • 報表、清單查詢,**主表不可遺漏** → LEFT JOIN(最常用)
  • 從表不可遺漏(如稽核所有訂單是否有對應人員) → RIGHT JOIN
  • 雙邊皆需完整呈現 → FULL JOIN
  • 僅需雙方都有資料的交集 → INNER JOIN

效能提示

  • ON 條件欄位務必建立索引
  • 大表驅動小表:將小表放在 LEFT JOIN 左側,或用 /*+ LEADING(small_table) USE_HASH(large_table) */
  • 避免在 ON 條件中使用函數/運算式,導致索引失效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved