从具有唯一列的小表中删除重复行
在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中文网其他相关文章!