我必须从没有主键或唯一约束的表中清除记录。
表格定义:
create table person(
name text,
staff_id integer,
work_code text,
location
);
不出所料,它包含大量重复和部分重复。 将记录转换为唯一集合的最佳方法是什么。除了name和staff_id
之外,我不必关心其他列答案 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;