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

时间:2012-01-01 19:14:00

标签: sql postgresql duplicates duplicate-removal

我必须从没有主键或唯一约束的表中清除记录。

表格定义:

create table person(
    name text,
    staff_id integer,
    work_code text,
    location
);

不出所料,它包含大量重复和部分重复。 将记录转换为唯一集合的最佳方法是什么。除了name和staff_id

之外,我不必关心其他列

2 个答案:

答案 0 :(得分:4)

当你

  

除了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;

我随意挑选“每(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);

临时表将在会话结束时自动删除。

当然,所有这一切最好在一个transaction内进行,所以在不太可能出现问题的情况下,你不会丢失任何东西。有些客户端会自动为一批执行的SQL语句执行此操作。

答案 1 :(得分:0)

也许这个?

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;