Ich habe eine Benutzerliste:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
und Ebenen
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
Und ich suche nach einer Abfrage, um die Ebene für jeden Benutzer zu erhalten. Etwas in der Art von:
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
So dass die Ergebnisse wären:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
Hat jemand irgendwelche Ideen oder Vorschläge, wie ich dies tun könnte, ohne auf Cursor zurückzugreifen?
quelle
INCLUDE
) hinzugefügt ? Haben Sie auch einen IndexUsers (UserType, Points)
? (Es könnte helfen)Users
) gibt es und wie breit ist diese Tabelle?Verwenden Sie dazu nur die rudimentären Operationen INNER JOIN, GROUP BY und MAX:
quelle
Ich denke, Sie können
INNER JOIN
ein Leistungsproblem verwenden, das Sie auchLEFT JOIN
stattdessen mit einerROW_NUMBER()
Funktion wie der folgenden verwenden können:SQL Fiddle Demo
quelle