首頁 >資料庫 >mysql教程 >如何在SQL中有效率地刪除表中的重複行?

如何在SQL中有效率地刪除表中的重複行?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-19 02:47:08117瀏覽

How to Efficiently Delete Duplicate Rows from a Table in SQL?

SQL:消除表中的重複行

挑戰:

您面臨著一個缺少主鍵或限制的表,其中包含多行具有相同資料的行。 目標是刪除重複的行,僅保留每個唯一行的一個實例。我們將使用名為「key」的欄位來識別重複項,確保每個不同的「key」值僅存在一個條目。

解:

此過程涉及兩個關鍵步驟:

  1. 辨識第一次出現:找出每個重複行的初始實例。
  2. 刪除後續重複項:刪除第 1 步驟中識別的不是第一次出現的所有行。

以下 SQL 指令可以完成此操作:

<code class="language-sql">DELETE FROM dups a USING (
    SELECT MIN(ctid) as ctid, key
    FROM dups 
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key 
AND a.ctid <> b.ctid;</code>

重要提示:此方法無法控制保留哪個特定行。

範例:

考慮這個範例表:

<code class="language-sql">CREATE TABLE people (
    name    varchar(50) NOT NULL,
    surname varchar(50) NOT NULL,
    age     integer NOT NULL
);

INSERT INTO people (name, surname, age) VALUES 
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);</code>

找出第一次出現的重複:

<code class="language-sql">SELECT MIN(ctid) as ctid, name, surname
FROM people 
GROUP BY (name, surname) HAVING COUNT(*) > 1;</code>

輸出:

ctid name surname
(0,1) A. Tom

刪除非第一個重複項:

<code class="language-sql">DELETE FROM people a USING (
    SELECT MIN(ctid) as ctid, name, surname
    FROM people 
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;</code>

剩餘行:

<code class="language-sql">SELECT * FROM people;</code>

輸出:

name surname age
A. Tom 30
B. Tom 20
B Chris 20

以上是如何在SQL中有效率地刪除表中的重複行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn