繁体   English   中英

从表中删除部分重复项,没有唯一列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM