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

SQL DISTINCT 完全指南:四大用法實例解析與常見誤區避坑

     編輯:關於SqlServer

核心概念:DISTINCT 是什麼?

DISTINCT 關鍵字用於過濾重複行,返回唯一不同的值組合。關鍵限制:只能返回 SELECT 清單中指定的欄位,無法直接搭配其他非去重欄位輸出。

四大用法實例演示

假設表 A 資料如下:

idname
1張三
2李四
3張三
4王五

示例 1:單欄位去重

SELECT DISTINCT name FROM A;

結果:張三、李四、王五(3 筆)

單欄位去重結果

示例 2:多欄位組合去重

SELECT DISTINCT name, id FROM A;

實際依據 name+id 組合 去重。因 id 為主鍵不重複,結果仍為 4 筆。

多欄位組合去重結果

支援度:Access 與 SQL Server 均支援。

示例 3:統計去重後筆數


-- SQL Server 支援
SELECT COUNT(DISTINCT name) FROM A;        -- 結果:3

-- SQL Server 不支援
SELECT COUNT(DISTINCT name, id) FROM A;    -- 語法錯誤

-- Access 兩者均不支援

示例 4:語法位置限制


-- 錯誤:DISTINCT 必須緊接 SELECT 之後
SELECT id, DISTINCT name FROM A;  -- 語法錯誤

常見誤區與解決方案

誤區:想取得去重欄位同時保留其他關聯欄位

錯誤想法:SELECT DISTINCT name, remark FROM A 期望 name 去重且保留對應 remark

現實:實際是 (name, remark) 組合去重,無法達成「name 去重 + 任意對應 remark」的需求。

解決方案:視資料庫而定

  • SQL Server:使用 ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) 取第一行
  • MySQL:GROUP BY name 搭配 ANY_VALUE(remark)(需關閉 ONLY_FULL_GROUP_BY)
  • 通用方案:子查詢先取去重鍵值,再 JOIN 回原表取完整資料

最佳實踐建議

  1. 明確業務意圖:是要「統計種類數」還是「取得代表行」?
  2. 避免濫用:大表 DISTINCT 會觸發昂貴的排序/雜湊去重操作
  3. 考慮替代方案:GROUP BY、EXISTS、視窗函數往往效能更優
  4. 索引支援:去重欄位若有索引,可走 Index Full Scan 避免排序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved