J'ai un tableau des utilisateurs:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
et niveaux
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
Et je recherche une requête pour obtenir le niveau pour chaque utilisateur. Quelque chose dans le sens de:
SELECT *
FROM Users U
INNER JOIN (
SELECT TOP 1 Level, U.UserName
FROM Levels L
WHERE L.MinPoints < U.Points
ORDER BY MinPoints DESC
) UL ON U.Username = UL.Username
Tels que les résultats seraient:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
Quelqu'un a-t-il des idées ou des suggestions sur la façon de procéder sans recourir à des curseurs?
la source
INCLUDE
)? De plus, avez-vous un index surUsers (UserType, Points)
? (ça pourrait aider)Users
) y a-t-il et quelle est la largeur de ce tableau?Pourquoi ne pas le faire en utilisant uniquement les opérations rudimentaires, INNER JOIN, GROUP BY et MAX:
la source
Je pense que vous pouvez utiliser un
INNER JOIN
problème de performance que vous pouvez également utiliser à laLEFT JOIN
place avec uneROW_NUMBER()
fonction comme celle-ci:Démo SQL Fiddle
la source