Sql-Server

查詢以選擇加入時的最大值

  • November 6, 2018

我有一個使用者表:

|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 |

引用自:https://dba.stackexchange.com/questions/129340