Mam tabelę użytkowników:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
i poziomy
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
I szukam zapytania, aby uzyskać poziom dla każdego użytkownika. Coś w stylu:
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
Tak, aby wyniki były:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
Czy ktoś ma jakieś pomysły lub sugestie, jak to zrobić bez uciekania się do kursorów?
źródło
INCLUDE
)? Czy masz też indeksUsers (UserType, Points)
? (może pomóc)Users
) i jak szeroka jest ta tabela?Dlaczego nie zrobić tego przy użyciu podstawowych operacji, WEJŚCIA WEWNĘTRZNEGO, GROUP BY i MAX:
źródło
Myślę, że możesz użyć
INNER JOIN
- jako problemu z wydajnością, którego możesz również użyć -LEFT JOIN
zROW_NUMBER()
taką funkcją:Wersja demonstracyjna SQL Fiddle
źródło