2010-07-14 15 views
1

Je dois mettre à jour une colonne dans une très très grande table. La performance est donc un gros problème.Mise à jour sur la ligne pour chaque groupe avec la valeur maximale dans l'autre colonne

La question est semblable à one, mais seulement pour Sybase Adaptive Server Enterprise (ASE 12.5.4) plus je dois faire une mise à jour sur les lignes récupérées. Y at-il un moyen de le faire sans une auto-adhésion comme dans la réponse la plus votée pour Oracle?

Ce fut la première tentative avec une jointure, mais il est par ordre de ralentir pour la table il est destiné à:

UPDATE table SET flag = 1 
FROM table AS a1 
LEFT OUTER JOIN table AS a2 
ON (a1.groupId = a2.groupId AND a1.id < a2.id) 
WHERE a2.groupId IS NULL 
and a1.somename in ('x', 'y') 

Répondre

1

would ...

UPDATE table AS t1 SET flag = 1 
    WHERE t1.somename IN ('x', 'y') AND 
      t1.id = (SELECT MAX (t2.id) 
        FROM table t2 
        WHERE t2.groupId = t1.groupId); 

être d'aide?

+1

Je pense qu'il vous manque un nom de corrélation 'WHERE t2.groupId = t1.groupId' ou quelque chose? –

+0

Hmmm. Je ne pensais pas en avoir besoin, mais tu as probablement raison; Je vais modifier en conséquence. –