2012-01-05 4 views
1

이 것은 아마도 모든 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_ids가 활성화되어 있고 가장 높은 ID를 제외한 모든 행을 active = 'y'로 바꾸는 모든 행을 찾는 쿼리를 실행해야합니다.

단일 쿼리에서이 작업을 수행 할 수 있습니까? 아니면이 작업을위한 스크립트를 작성해야합니까?

답변

2

ANSI 스타일 (BTW PostgreSQL을, 사용) :

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

포스트 그레스 특정을 :

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 

은 각 행에 대해 상관 하위 쿼리를 수행하지 이후 두 번째는, 조금 더 빨리 아마. 즐겨!

+0

매력처럼 작동했습니다! 에릭 감사합니다! – Anthony

+0

'id'는 작업에 고유해야합니다 (btw). –