首頁 > 資料庫 > mysql教程 > 如何從 PostgreSQL 表中刪除重複行,同時保留唯一列?

如何從 PostgreSQL 表中刪除重複行,同時保留唯一列?

Mary-Kate Olsen
發布: 2025-01-19 02:43:10
原創
113 人瀏覽過

How to Delete Duplicate Rows from a PostgreSQL Table While Preserving a Unique Column?

從具有唯一列的小表中刪除重複行

在PostgreSQL資料庫中,消除重複行可以增強資料完整性並最佳化效能。假設您有一個表,其中包含不受約束的行和重複數據,尤其是在名為“key”的特定列中。目標是刪除重複項並保留每個唯一“key”值的單一實例。

單一SQL指令解決方案

要使用單一SQL指令執行此操作,可以使用下列步驟:

1. 辨識首次重複出現: 首先,我們需要辨識每個重複行的第一次出現。此資訊對於保留資料的單一副本至關重要。

<code class="language-sql">SELECT MIN(ctid) AS ctid, key
FROM dups
GROUP BY key HAVING COUNT(*) > 1;</code>
登入後複製

2. 刪除非首次出現: 一旦識別出第一次出現,我們就可以根據它們的“ctid”值刪除所有後續的重複項。 “ctid”列表示行在表中的實體位置。

<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);

-- 显示重复项的第一次出现:
SELECT MIN(ctid) AS ctid, name, surname
FROM people
GROUP BY (name, surname) HAVING COUNT(*) > 1;

-- 删除重复项的非第一次出现:
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;

SELECT * FROM people;</code>
登入後複製

此範例表包含可能重複的個人資料。執行第二個查詢後,重複項目將被刪除,並且表中只剩下唯一的姓名和姓氏。

以上是如何從 PostgreSQL 表中刪除重複行,同時保留唯一列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板