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

SQL 找出指定欄位值完全相同的資料列:自我聯結去重技巧

     編輯:關於SqlServer

需求:「找出 title 與 address 同時相同的電影明星配對」。直覺用 <> 會產生鏡像重複(A-B、B-A),本文示範用 < 巧妙去重。

一、範例資料表 movestar

id | name      | title           | address
---|-----------|-----------------|----------
1  | 成龍      | 動作巨星        | 香港
2  | 李連傑    | 動作巨星        | 香港
3  | 周星馳    | 喜劇之王        | 香港
4  | 劉德華    | 天王巨星        | 香港

二、核心查詢

SELECT star1.name AS name1, 
       star2.name AS name2, 
       star1.title, 
       star1.address
FROM movestar AS star1
JOIN movestar AS star2
  ON star1.title = star2.title
 AND star1.address = star2.address
 AND star1.name < star2.name;  -- 關鍵:字典序去重

三、結果

name1 | name2 | title    | address
------|-------|----------|--------
成龍  | 李連傑 | 動作巨星 | 香港

四、原理解析

  • star1.name < star2.name:利用字串大小比較,只保留「名字較小」在前的組合,自動排除 (李連傑, 成龍) 以及 (成龍, 成龍) 這類自配對。
  • 若改用 <>,會產生 雙向重複 與 自我配對,資料筆數暴增 2~3 倍。

五、延伸應用:找出所有重複群組

SELECT title, address, COUNT(*) AS dup_cnt, 
       STRING_AGG(name, ', ') AS names  -- SQL Server 2017+ / PostgreSQL
FROM movestar
GROUP BY title, address
HAVING COUNT(*) > 1;

現代資料庫建議直接用 GROUP BY ... HAVING COUNT(*) > 1 配合字串聚合函數,語意更清晰、效能更佳。

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