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

Oracle 行轉列 (PIVOT) 與 JOIN 語法完整總結:DECODE 實現交叉表與內外連接寫法對照

     編輯:Oracle 資料庫基礎

行轉列 (PIVOT) 實戰:DECODE + SUM + GROUP BY

原始資料 (學生成績表 A)

IDNAMESUBJECTSCORE
1張三語文90
2張三數學80
3李四語文99
4李四數學78
5張三英語89

目標格式:學生為列、科目為欄

NAME語文數學英語
張三908089
李四9978-

單一 SQL 實現

SELECT NAME,
       SUM(DECODE(SUBJECT, '語文', SCORE, NULL)) AS 語文,
       SUM(DECODE(SUBJECT, '數學', SCORE, NULL)) AS 數學,
       SUM(DECODE(SUBJECT, '英語', SCORE, NULL)) AS 英語
FROM A
GROUP BY NAME;

原理說明

  • DECODE(SUBJECT, '語文', SCORE, NULL):科目匹配時取分數,否則 NULL
  • SUM(...):同一學生同科目可能多筆 (取總和),NULL 不參與加總
  • GROUP BY NAME:按學生分組,產生一行

11g+ 新語法: 可使用標準 PIVOT 子句:SELECT * FROM A PIVOT (SUM(SCORE) FOR SUBJECT IN ('語文','數學','英語')),語法更直觀。

JOIN 語法總結

1. INNER JOIN (內連接)

僅回傳兩表符合條件的匹配行

-- 舊式寫法
SELECT * FROM A A, B B WHERE A.ID = B.AID;

-- ANSI SQL-92 標準寫法 (推薦)
SELECT * FROM A A INNER JOIN B B ON A.ID = B.AID;

2. LEFT JOIN / LEFT OUTER JOIN (左外連接)

保留左表 (A) 所有行,右表 (B) 無匹配則為 NULL

SELECT * FROM A A LEFT JOIN B B ON (A.ID = B.AID);
-- LEFT OUTER JOIN 同義,OUTER 可省略

3. RIGHT JOIN / RIGHT OUTER JOIN (右外連接)

保留右表所有行,左表無匹配則為 NULL

SELECT * FROM A A RIGHT JOIN B B ON (A.ID = B.AID);

4. FULL OUTER JOIN (全外連接)

保留兩表所有行,無匹配處以 NULL 填補

SELECT * FROM A A FULL OUTER JOIN B B ON (A.ID = B.AID);

5. CROSS JOIN (交叉連接/笛卡兒積)

無 ON 條件,回傳兩表行數乘積

SELECT * FROM A CROSS JOIN B;

JOIN 類型對照表

JOIN 類型保留左表保留右表典型用途
INNER JOIN否否關聯查詢、主從表明細
LEFT JOIN是否主表帶明細、缺漏分析
RIGHT JOIN否是同 LEFT,視角互換
FULL OUTER JOIN是是資料對帳、差異比對
CROSS JOIN全排列全排列組合生成、測試資料

總結

  • 行轉列核心:DECODE/CASE 條件聚合 + GROUP BY,11g+ 建議用 PIVOT
  • JOIN 採用 ANSI SQL-92 標準語法 (INNER/LEFT/RIGHT/FULL JOIN ... ON),可讀性與可攜性優於舊式 WHERE 條件寫法
  • 外連接 (LEFT/RIGHT/FULL) 是處理「主表全保留、明細可選」業務場景的關鍵工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved