Saya punya tabel Pengguna:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
dan Level
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
Dan saya mencari kueri untuk mendapatkan level untuk setiap pengguna. Sesuatu di sepanjang garis:
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
Sedemikian rupa sehingga hasilnya akan:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
Adakah yang punya ide atau saran tentang bagaimana saya bisa melakukan ini tanpa menggunakan kursor?
sumber
INCLUDE
)? Juga, apakah Anda memiliki indeksUsers (UserType, Points)
? (mungkin membantu)Users
) di sana dan seberapa lebar tabel itu?Mengapa tidak hanya menggunakan operasi yang belum sempurna, INNER JOIN, GROUP BY, dan MAX:
sumber
Saya pikir Anda dapat menggunakan
INNER JOIN
-sebagai masalah kinerja Anda juga dapat menggunakan-LEFT JOIN
denganROW_NUMBER()
fungsi seperti ini:Demo SQL Fiddle
sumber