2012-01-05 6 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 

私が働いているシステムの動作方法を、それだけで、親ごとに1つのアクティブな行を持つ必要があります。したがって、ID#2と#3がアクティブであればOKです(= n)。

重複しているparent_idがアクティブなすべての行を見つけ、最も高いID以外のすべてをアクティブ= 'y'にフリップするクエリを実行する必要があります。

これは単一のクエリで実行できますか、それともスクリプトを記述する必要がありますか?

答えて

2

ANSIスタイル(ところでPostgresqlの、使用):

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

+0

'id'は作業に一意でなければならない、btw。 –

関連する問題