Eu tenho uma tabela de usuários:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
e Níveis
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
E estou procurando uma consulta para obter o nível de cada usuário. Algo ao longo das linhas 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
De tal forma que os resultados seriam:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
Alguém tem alguma idéia ou sugestão de como eu poderia fazer isso sem recorrer a cursores?
fonte
INCLUDE
)? Além disso, você tem um índiceUsers (UserType, Points)
? (que poderia ajudar)Users
) existem e qual a largura dessa tabela?Por que não fazê-lo usando apenas as operações rudimentares, INNER JOIN, GROUP BY e MAX:
fonte
Eu acho que você pode usar um
INNER JOIN
- como um problema de desempenho, você também pode usarLEFT JOIN
- com umaROW_NUMBER()
função como esta:Demonstração do SQL Fiddle
fonte