从一到多获取 Max(id) table

Get Max(id) from one to many table

我知道这个问题被问过很多次,但我一直在尝试,但没有成功

我在两个表之间有 one to many 关系,还有一些 inner-joins 以获得更多数据。

这是我的查询:

SELECT     
    ShopOffer.OfferID, 
    ShopOffer.OfferMessage,     
    Shop.ID,                             
    Shop.Name,           
    Shop.Phone, 
    [User].Name,            
    [User].UserID, 
    ShopOfferStatus.Name AS StatusName,     
    BlockedShopInUser.IsBlocked

FROM         
    ShopOffer 
    INNER JOIN ShopOfferStatus ON ShopOffer.ShopOfferStatusID = ShopOfferStatus.ShopOfferStatusID 
    INNER JOIN Shop ON ShopOffer.ShopID = Shop.ShopID 
    INNER JOIN UserRequest ON ShopOffer.UserRequestID = UserRequest.UserRequestID 
    INNER JOIN [User] ON UserRequest.UserID = [User].UserID 
    INNER JOIN BlockedShopInUser ON Shop.ShopID = BlockedShopInUser.ShopID AND [User].UserID = BlockedShopInUser.UserID

每个商店可以创建很多优惠。在该查询中,我只想获得每家商店的最后报价。

谢谢。

我认为你必须从 Shop 开始,然后对来自 ShopOfferTOP 1 记录执行 CROSS APPLY:

SELECT     
    ShopOffer.OfferID, 
    ShopOffer.OfferMessage,     
    Shop.ID,                             
    Shop.Name,           
    Shop.Phone, 
    [User].Name,            
    [User].UserID, 
    ShopOfferStatus.Name AS StatusName,     
    BlockedShopInUser.IsBlocked

FROM Shop
    CROSS APPLY (
       SELECT TOP 1 OfferID, OfferMessage, ShopOfferStatusID, UserRequestID
       FROM ShopOffer AS s
       WHERE s.ShopID = Shop.ShopID 
       ORDER BY s.OfferID DESC
    ) ShopOffer
    INNER JOIN ShopOfferStatus ON ShopOffer.ShopOfferStatusID = ShopOfferStatus.ShopOfferStatusID 
    INNER JOIN UserRequest ON ShopOffer.UserRequestID = UserRequest.UserRequestID 
    INNER JOIN [User] ON UserRequest.UserID = [User].UserID 
    INNER JOIN BlockedShopInUser ON Shop.ShopID = BlockedShopInUser.ShopID AND [User].UserID = BlockedShopInUser.UserID

这里有一个方法:

;WITH LastShopOffer AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY ShopID ORDER BY OfferID DESC)
    FROM ShopOffer
)
SELECT     
    SO.OfferID, 
    SO.OfferMessage,     
    S.ID,                             
    S.Name,           
    S.Phone, 
    U.Name,            
    U.UserID, 
    SOS.Name AS StatusName,     
    B.IsBlocked
FROM (  SELECT * 
        FROM LastShopOffer
        WHERE RN = 1) SO
INNER JOIN ShopOfferStatus SOS 
    ON SO.ShopOfferStatusID = SOS.ShopOfferStatusID 
INNER JOIN Shop S
    ON SO.ShopID = S.ShopID 
INNER JOIN UserRequest UR
    ON SO.UserRequestID = UR.UserRequestID 
INNER JOIN [User] U 
    ON UR.UserID = U.UserID 
INNER JOIN BlockedShopInUser B
    ON S.ShopID = B.ShopID 
    AND U.UserID = B.UserID;