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中文网其他相关文章!