SQL:消除表中的重複行
挑戰:
您面臨著一個缺少主鍵或限制的表,其中包含多行具有相同資料的行。 目標是刪除重複的行,僅保留每個唯一行的一個實例。我們將使用名為「key」的欄位來識別重複項,確保每個不同的「key」值僅存在一個條目。
解:
此過程涉及兩個關鍵步驟:
以下 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中文網其他相關文章!