删除具有重复辅助值的行

时间:2012-01-05 16:23:45

标签: postgresql duplicates

这可能是任何DBA的垒球问题,但这是我的挑战。我有一张看起来像这样的表:

id     parent_id    active
---    ---------    -------
1      5            y
2      6            y
3      6            y
4      6            y
5      7            y
6      8            y

我正在处理的系统运行方式,每个父级应该只有一个活动行。因此,如果ID#2和#3处于活动状态='n',则可以。

我需要运行一个查询,查找所有具有重复的parent_id且处于活动状态的行,并将除最高ID以外的所有行翻转为active ='y'。

这可以在一个查询中完成,还是我必须为它编写脚本? (使用Postgresql,顺便说一句)

1 个答案:

答案 0 :(得分:2)

ANSI样式:

update table set
    active = 'n'
where
    id <> (select max(id) from table t1 where t1.parent_id = table.parent_id)

Postgres具体:

update t1 set
    active = 'n'
from
    table t1
    inner join (select max(id) as topId, parent_id from table group by parent_id) t2 on
        t1.id < t2.topId
        and t1.parent_id = t2.parent_id

第二个可能有点快,因为它没有为每一行做相关的子查询。享受!