[英]Remove partial duplicates from table with no unique column
我必须从没有主键或唯一约束的表中清除记录。
表定义:
create table person(
name text,
staff_id integer,
work_code text,
location
);
不出所料,它包含大量重复和部分重复。 将记录转换为唯一集合的最佳方法是什么。 除了name和staff_id之外,我不必关心其他列
就像你一样
除了name和staff_id之外,不必关心其他列
这可能是您清理表格的过程:
1.)创建一个唯一行的临时表:
CREATE TEMP TABLE p_tmp AS
SELECT DISTINCT ON (name, staff_id)
name, staff_id, work_code, location
FROM person
ORDER BY name, staff_id, work_code, location;
我随意选择“第一行per (name, staff_id)
- 最小work_code
和匹配location
。
2.)空表:
TRUNCATE person;
3.)重新插入独特的元组:
INSERT INTO person SELECT * FROM p_tmp;
确保,欺骗不会再次进入。添加代理主键:
ALTER TABLE person ADD COLUMN person_id serial PRIMARY KEY;
ALTER TABLE person ADD UNIQUE (name, staff_id);
或者只是添加一个多列主键:
ALTER TABLE person ADD PRIMARY KEY (name, staff_id);
临时表将在会话结束时自动删除。
当然,所有这一切最好在一次交易中完成,所以在不太可能出现问题的情况下,你不会丢失任何东西。 有些客户端会自动为一次执行的一批SQL语句执行此操作。
也许这个?
select t.name, t.staff_id, t.work_code, t.location
from (
select name, staff_id, work_code, location, count(*) nr
from person
group by name, staff_id, work_code, location
) t
where t.nr > 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.