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

Oracle DISTINCT 去重完整用法與 GROUP BY 進階統計

     編輯:Oracle 資料庫相關知識

DISTINCT 基本語法

SELECT DISTINCT column1, column2, ...
FROM table_name
[WHERE condition];

作用:回傳不重複的資料列組合。`UNIQUE` 為同義字。

效能特性

  • 內部執行排序去重 (SORT UNIQUE),大量資料耗 CPU/記憶體/臨時表空間。
  • 若欄位有索引,優化器可採用索引全掃描避免排序 (INDEX FULL SCAN)。
  • 僅需統計筆數時,12c+ 使用 APPROX_COUNT_DISTINCT(col) 近似算法,效能提升 10-100 倍。

實戰範例:Employee 表去重

測試資料 (8 筆,City/Description 有重複)

ID FIRST_NAME LAST_NAME CITY      DESCRIPTION
-- ---------- --------- --------  -----------
01 Jason      Martin    Toronto   Programmer
02 Alison     Mathews   Vancouver Tester
03 James      Smith     Vancouver Tester
04 Celia      Rice      Vancouver Manager
05 Robert     Black     Vancouver Tester
06 Linda      Green     New York  Tester
07 David      Larry     New York  Manager
08 James      Cat       Vancouver Tester

去重 City + Description 組合

SELECT DISTINCT City, Description FROM Employee;

CITY      DESCRIPTION
--------- -----------
New York  Manager
Vancouver Tester
Toronto   Programmer
Vancouver Manager
New York  Tester
-- 5 種組合 (Vancouver Tester 出現 3 次只保留 1 筆)

DISTINCT 搭配 COUNT 統計

SELECT coder,
       COUNT(DISTINCT course) AS distinct_courses,
       COUNT(*) AS total_rows
FROM offerings
GROUP BY coder;

CODER DISTINCT_COURSES TOTAL_ROWS
----- ---------------- ----------
1     2                3
4     2                2
8     2                2
11    1                1
13    2                2
  • `COUNT(DISTINCT course)`:每組統計不重複課程數
  • `COUNT(*)`:統計總行數 (含重複)

進階:多欄位 DISTINCT 統計

-- 統計每位講師開授的「不同課程-學期」組合數
SELECT instructor_id,
       COUNT(DISTINCT course_id || '#' || term) AS unique_offerings
FROM course_schedule
GROUP BY instructor_id;

常見誤區與正確替代

誤區問題正確做法
`SELECT DISTINCT a, b, c FROM t` 然後應用程式再處理資料庫端排序大量資料,網路傳輸量大在 SQL 直接完成聚合:`SELECT a, b, COUNT(*) FROM t GROUP BY a, b`
大表 `SELECT DISTINCT *`全欄位比較極慢僅選必要欄位,或建立覆蓋索引
用 `DISTINCT` 解決關聯查詢重複治標不治本,掩蓋關聯邏輯錯誤檢查 JOIN 條件、外鍵關係、是否需 `EXISTS` 半連接

12c 新函數:APPROX_COUNT_DISTINCT

SELECT APPROX_COUNT_DISTINCT(customer_id) FROM sales;
-- 近似值,誤差通常 < 1%,執行時間從秒級降至毫秒級

適用場景:儀表板概覽、大數據探索、非精確會計統計。

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