这可能是任何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,顺便说一句)
答案 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
第二个可能有点快,因为它没有为每一行做相关的子查询。享受!