從具有唯一列的小表中刪除重複行
在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中文網其他相關文章!