如何获取未被Buyers表Top3采购者订购的Beer表啤酒数据?
解决方案:找出未被Top3采购者订购的啤酒
核心思路
先确定按总采购量排序的Top3采购主体,再找出这些采购者订购过的所有啤酒,最后从Beer表中排除这些啤酒,得到目标结果。
实现SQL(SQL Server环境)
-- 第一步:计算每个采购主体的总采购量,筛选Top3采购者 WITH TopBuyers AS ( SELECT TOP 3 PubId, StoreId, SUM(Quantity) AS TotalQuantity FROM dbo.Buyers GROUP BY PubId, StoreId ORDER BY TotalQuantity DESC ) -- 第二步:从Beer表中排除Top3采购者订购过的啤酒 SELECT BeerId FROM dbo.Beer br WHERE NOT EXISTS ( SELECT 1 FROM dbo.Buyers b JOIN TopBuyers tb ON b.PubId = tb.PubId AND b.StoreId = tb.StoreId WHERE b.BeerId = br.BeerId );
原查询无结果的常见原因排查
- 错误识别采购主体:若原查询用
BuyId(单次采购记录ID)作为采购者标识分组,会导致每个采购记录单独统计,无法得到正确的Top3采购主体。 - NOT IN的NULL陷阱:若原查询用
NOT IN且子查询返回的BeerId包含NULL值,SQL中任何值与NULL比较都会返回UNKNOWN,最终导致查询无结果,推荐用NOT EXISTS替代。 - 未去重订购记录:Top3采购者可能多次订购同一款啤酒,若未对订购的啤酒ID去重,可能导致排除逻辑出错。
执行上述SQL后,即可得到预期的BeerId=4和BeerId=5。
内容的提问来源于stack exchange,提问作者Sven Marenković
相关产品推荐
相关产品推荐

