У меня есть таблица пользователей:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
и уровни
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
И я ищу запрос, чтобы получить уровень для каждого пользователя. Что-то вроде:
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
Так что результаты будут:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
У кого-нибудь есть идеи или предложения о том, как я могу сделать это, не прибегая к курсорам?
источник
INCLUDE
)? Кроме того, у вас есть индекс наUsers (UserType, Points)
? (это может помочь)Users
) и какова ширина этой таблицы?Почему бы не сделать это, используя только элементарные операции, INNER JOIN, GROUP BY и MAX:
источник
Я думаю, что вы можете использовать -
INNER JOIN
как проблему с производительностью, которую вы также можете использоватьLEFT JOIN
вместо этого - сROW_NUMBER()
такой функцией:SQL Fiddle Demo
источник