首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 連接查詢 SQL 全攻略:內連接、外連接、交叉連接語法與等價寫法

     編輯:Oracle 資料庫相關知識

系統整理 Oracle 多表連接的四大類型:內連接、左/右/全外連接、交叉連接,提供標準 ANSI 語法、Oracle 舊式語法、結果集語義、適用場景與效能提示。

連接類型總覽

類型ANSI 標準語法Oracle 舊式語法結果集特徵
內連接INNER JOIN ... ONWHERE a.id = b.id僅保留雙邊匹配的列
左外連接LEFT JOIN ... ONWHERE a.id = b.id(+)保留左表所有列,右表無匹配為 NULL
右外連接RIGHT JOIN ... ONWHERE a.id(+) = b.id保留右表所有列,左表無匹配為 NULL
全外連接FULL JOIN ... ON不支援(需 UNION 模擬)保留雙表所有列,無匹配皆為 NULL
交叉連接CROSS JOINFROM a, b 無 WHERE笛卡爾積,列數 = 左列數 × 右列數

標準語法範例(以 mt_pb_org、mt_pb_orgframe 為例)

-- 1. 內連接
SELECT * FROM mt_pb_org o
INNER JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;

-- 2. 左外連接
SELECT * FROM mt_pb_org o
LEFT JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
-- 等價舊式
SELECT * FROM mt_pb_org o, mt_pb_orgframe f
WHERE o.pb_orgframeid = f.pb_orgframeid(+);

-- 3. 右外連接
SELECT * FROM mt_pb_org o
RIGHT JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;
-- 等價舊式
SELECT * FROM mt_pb_org o, mt_pb_orgframe f
WHERE o.pb_orgframeid(+) = f.pb_orgframeid;

-- 4. 全外連接
SELECT * FROM mt_pb_org o
FULL JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;

-- 5. 交叉連接
SELECT * FROM mt_pb_org o
CROSS JOIN mt_pb_orgframe f;

外連接 vs 內連接關鍵差異

外連接回傳結果**不僅包含符合條件的列,還包含單邊表所有不符合條件的列**(另一邊欄位填 NULL)。這是「保留主表、補充從表」的核心語義。

效能與寫法最佳實務

  • 優先使用 ANSI 標準語法: 可讀性高、可移植、優化器轉換選擇更多
  • 外連接條件放在 ON 而非 WHERE: LEFT JOIN b ON a.id = b.id AND b.status = 'A' 保留左表所有列;若寫在 WHERE 會隱性轉內連接
  • 避免在外連接表上使用 OR/IN 條件: 易導致優化器無法轉換為 Hash/Outer Join,退化為 Nested Loops
  • 大表驅動小表: 將小表/結果集小的表放在外連接的「保留側」(LEFT JOIN 的左表),減少外層迴圈次數
  • 交叉連接極度危險: 除非明確需要笛卡爾積(如產生日期維度×部門維度),否則嚴禁在生產 SQL 出現 CROSS JOIN 或無 WHERE 的舊式連接

多表連接順序提示

-- 使用 LEADING Hint 指定連接順序
SELECT /*+ LEADING(o f) USE_HASH(f) */ *
FROM mt_pb_org o
LEFT JOIN mt_pb_orgframe f ON o.pb_orgframeid = f.pb_orgframeid;

連接查詢是 SQL 的核心。**掌握四大類型語義、標準語法、ON/WHERE 陷阱、優化器行為**,是寫出高效正確多表查詢的前提。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved