如何从Product与Prices表关联获取ID、ID_Forn及最低Price?
解决方案
要获取每个Product ID对应的最小Price及对应的ID_Forn,你可以通过以下两种常见方法实现:
方法一:使用窗口函数(推荐,逻辑清晰)
通过ROW_NUMBER()窗口函数为每个Product ID的价格按升序排序,标记出最小价格的那条记录,再与Product表关联:
SELECT P.ID, PP.ID_Forn, PP.Price AS Min_Price FROM Product P(NOLOCK) LEFT JOIN ( SELECT ID, ID_Forn, Price, -- 按ID分组,价格升序排序,最小价格的记录标记为rn=1 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Price ASC) AS rn FROM Prices(NOLOCK) ) PP ON P.ID = PP.ID AND PP.rn = 1
说明:
- 用
LEFT JOIN保证即使Product表中没有对应Prices记录(比如ID3、4),也能返回该Product的ID,对应的ID_Forn和Min_Price会显示为NULL - 如果同一个Product ID存在多个相同的最小Price,此方法只会返回其中一条(排序后第一条),若要返回所有符合条件的记录,可将
ROW_NUMBER()替换为RANK()
方法二:先聚合最小价格再关联
先通过分组查询得到每个Product ID的最小价格,再关联Prices表找到对应的ID_Forn:
SELECT P.ID, PP.ID_Forn, MinPrices.Min_Price FROM Product P(NOLOCK) LEFT JOIN ( -- 先获取每个ID的最小价格 SELECT ID, MIN(Price) AS Min_Price FROM Prices(NOLOCK) GROUP BY ID ) MinPrices ON P.ID = MinPrices.ID -- 关联回Prices表找到对应最小价格的ID_Forn LEFT JOIN Prices PP(NOLOCK) ON MinPrices.ID = PP.ID AND MinPrices.Min_Price = PP.Price
说明:
- 若同一个Product ID存在多个相同的最小Price,此方法会返回多条记录(所有符合最小价格的条目),如需去重可添加
DISTINCT关键字
原查询的问题
你之前的查询使用了标量子查询,这类子查询只能返回单个值,因此无法同时获取ID_Forn字段。上述两种方法通过关联查询或多列子查询,解决了这个限制。
内容的提问来源于stack exchange,提问作者Nuno Monteiro
相关产品推荐
相关产品推荐

