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

SQL 查找與刪除重複記錄的標準寫法

     編輯:關於SqlServer

範例資料表

CREATE TABLE tbl (a INT);
INSERT INTO tbl VALUES (1),(2),(2),(3),(3),(3);

1. 查找重複值

SELECT a
FROM tbl
GROUP BY a
HAVING COUNT(*) > 1;

結果:2, 3

2. 刪除重複記錄(保留一筆)

Oracle / PostgreSQL(使用 ROWID/CTID)

DELETE FROM tbl A
WHERE A.ROWID < (SELECT MAX(B.ROWID) FROM tbl B WHERE A.a = B.a);

SQL Server(使用主鍵或唯一識別欄位)

假設表有主鍵 id:

DELETE FROM tbl
WHERE id NOT IN (
    SELECT MAX(id) FROM tbl GROUP BY a
);

或使用 CTE + ROW_NUMBER(SQL Server 2005+):

WITH cte AS (
    SELECT id, ROW_NUMBER() OVER (PARTITION BY a ORDER BY id) AS rn
    FROM tbl
)
DELETE FROM cte WHERE rn > 1;

MySQL(不支援刪除同表子查詢,需多表連接)

DELETE t1 FROM tbl t1
INNER JOIN tbl t2
WHERE t1.id < t2.id AND t1.a = t2.a;

通用原則

  1. 先以 GROUP BY ... HAVING COUNT(*) > 1 確認重複鍵值。
  2. 依資料庫特性選擇保留策略:ROWID、MAX(PK)、ROW_NUMBER()。
  3. 大量刪除時建議分批次執行,避免長時間鎖表、記錄檔暴增。
  4. 執行前務必備份或在交易中測試(BEGIN TRAN ... ROLLBACK)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved