2012-01-05 30 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_id且處於活動狀態的行,並且將最高ID全部翻轉爲active ='y'。

這可以在單個查詢中完成,還是必須爲它編寫腳本? (使用PostgreSQL,順便說一句)

回答

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 

第二個可能是有點快,因爲它沒有做的每一行相關子查詢。請享用!

+0

這就像一個魅力!謝謝埃裏克! – Anthony 2012-01-05 20:49:44

+0

要求'id'是唯一的工作,順便說一句。 – 2012-01-05 23:05:04