2012-01-05 3 views
1

Celui-ci est probablement une question de softball pour n'importe quel DBA, mais voici mon défi. J'ai une table qui ressemble à ceci:Suppression de lignes avec des valeurs secondaires en double

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

La façon dont le système je travaille fonctionne, il ne devrait avoir une ligne active par parent. Ainsi, ce serait bien si ID # 2 et # 3 étaient actifs = 'n'.

J'ai besoin d'exécuter une requête qui trouve toutes les lignes qui ont des parent_ids en double qui sont actives et de retourner tous les ID sauf l'ID le plus élevé à active = 'y'. Est-ce que cela peut être fait dans une seule requête, ou dois-je écrire un script pour cela? (L'utilisation Postgresql, btw)

Répondre

2

style ANSI:

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

Postgres spécifique:

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 

Le second est probablement un peu plus vite, car il est fait pas une sous-requête corrélée pour chaque ligne. Prendre plaisir!

+0

Cela a fonctionné comme un charme! Merci Eric! – Anthony

+0

Exige 'id' d'être unique au travail, btw. –

Questions connexes