2011-04-23 2 views
0

J'ai une table avec trois colonnes,Assign 1 rang arbitraire primaire par groupe

foo_id | bar_id | is_primary 

Maintenant, après avoir importé une énorme quantité d'enregistrements paires id sont tous dans mais le is_primary est 0 partout, je dois affecter 1 ligne arbitraire par foo_id sous is_primary = 1?

foo_id | bar_id sont les clés primaires uniques, mais à la fois foo_id et bar_id peuvent apparaître plusieurs fois

+0

Quelle est la clé primaire? –

+0

foo_id & bar_id – Moak

Répondre

1

En supposant toutes les paires (foo_id, bar_id) sont uniques et is_primary est limité à 0 ou 1 (aucune autre valeur ou NULL), vous pouvez déterminer, par exemple, la valeur minimum bar_id pour chaque valeur foo_id et définir is_primary sur 1 pour les lignes correspondantes:

UPDATE atable t 
    INNER JOIN (
    SELECT 
     foo_id, 
     MIN(bar_id) AS bar_id 
    FROM atable 
    GROUP BY foo_id 
    HAVING MAX(is_primary) = 0 
) s ON t.foo_id = s.foo_id AND t.bar_id = s.bar_id 
SET t.is_primary = 1 
0

En supposant que (foo_id,bar_id) est unique, vous pouvez utiliser une clause not exists pour filtrer la valeur la plus élevée de bar_id par foo_id:

update YourTable yt1 
set  is_primary = 1 
where not exists 
     (
     select * 
     from YourTable yt2 
     where yt2.foo_id = yt1.foo_id 
       and yt2.bar_id > yt1.bar_id 
     ) 
Questions connexes