Sql-Server
查詢以選擇加入時的最大值
我有一個使用者表:
|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 |
有沒有人對我如何在不使用游標的情況下做到這一點有任何想法或建議?
您現有的查詢與您可以使用的查詢接近,但您可以通過進行一些更改輕鬆獲得結果。通過更改查詢以使用
APPLY
運算符並實現CROSS APPLY
. 這將返回滿足您要求的行。這是您可以使用的版本:SELECT u.Username, u.UserType, u.Points, lv.Level FROM Users u CROSS APPLY ( SELECT TOP 1 Level FROM Levels l WHERE u.UserType = l.UserType and l.MinPoints < u.Points ORDER BY l.MinPoints desc ) lv;
這是一個帶有展示的 SQL Fiddle。這會產生一個結果:
| Username | UserType | Points | Level | |----------|----------|--------|--------| | John | A | 250 | Silver | | Mary | A | 150 | Bronze | | Anna | B | 600 | Bronze |