2010-04-28 11 views
0

je la structure de tableau ci-dessous pour un lecteur de tableoptimisation SQL Rank requête

Table Player { 
Long playerID; 
Long points; 
Long rank; 
} 

En supposant que le playerID et les points ont des valeurs valides, puis-je mettre à jour le rang pour tous les joueurs en fonction du nombre de points dans une seule requête? Si deux personnes ont le même nombre de points, elles doivent égaliser pour le classement. J'utilise hibernate, donc je ne peux pas exécuter de requêtes avec des variables, donc j'ai trouvé cette requête qui est très inefficace. Cela peut-il être optimisé pour fonctionner avec les contraintes spécifiées ci-dessus?

update player g1 
    set g1.rank = 1 + 
    ((SELECT count(*) from 
    (select * from player) g2 
    where g2.points > g1.points)) 
+0

Vous pouvez modifier votre question plus tôt, et laisser des commentaires à demander des éclaircissements sur une réponse. Pas besoin d'ouvrir une nouvelle question ... – meriton

+0

@meriton - C'est ce que j'ai fait initialement, mais on m'a suggéré d'ouvrir une nouvelle question. Désolé si je n'ai pas respecté les conventions. – smahesh

Répondre

1

Si vous utilisez T-SQL MS SQL Server 2005+, je vous recommande d'avoir un regard sur le fantastique ROW_NUMBER(), RANK() ET DENSE_RANK() et NTILE() fonctions!

Read more here about them

+0

Ils sont également disponibles dans Oracle et PostgreSQL. –