Lam*_*lan 15 join sql-server sql-server-2012 max
我有一个用户表:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
Run Code Online (Sandbox Code Playgroud)
和级别
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个查询来获取每个用户的级别。类似的东西:
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
Run Code Online (Sandbox Code Playgroud)
这样的结果将是:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 |Bronze |
Run Code Online (Sandbox Code Playgroud)
有没有人对如何在不求助于游标的情况下做到这一点有任何想法或建议?
Tar*_*ryn 16
您现有的查询接近于您可以使用的内容,但您可以通过进行一些更改轻松获得结果。通过更改您的查询以使用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;
Run Code Online (Sandbox Code Playgroud)
这是一个带有演示的SQL Fiddle。这产生了一个结果:
| Username | UserType | Points | Level |
|----------|----------|--------|--------|
| John | A | 250 | Silver |
| Mary | A | 150 | Bronze |
| Anna | B | 600 | Bronze |
Run Code Online (Sandbox Code Playgroud)