查询以选择连接时的最大值

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)