AdventureWorks2016环境下TSQL查询新店开设Top10优先城市问题求解
错误原因分析
- 原语句使用
EXCEPT时会对两个查询返回的**整行(City + Priority)**做全匹配排除,仅当「城市名称+买家数量」同时和有门店城市的统计结果完全一致时才会被剔除,不符合「只要城市存在已开门店就排除」的需求,自然会出现城市唯一性失效、结果错误的问题。
正确TSQL实现
SELECT TOP 10 City, COUNT(1) AS [Priority] FROM Sales.vIndividualCustomer c WHERE NOT EXISTS ( -- 过滤已有门店的城市 SELECT 1 FROM Purchasing.vVendorWithAddresses v WHERE v.City = c.City ) GROUP BY City ORDER BY [Priority] DESC GO
逻辑说明
- 先通过
NOT EXISTS过滤所有在门店地址视图中出现过的城市,保证入选城市无已开设门店 - 对符合条件的城市按买家数量统计得到Priority
- 按Priority倒序排序后取前10个结果,完全匹配需求
- 优先使用
NOT EXISTS而非NOT IN,可以避免NULL值引发的逻辑异常,兼容性更高
内容的提问来源于stack exchange,提问作者ku4er99
相关产品推荐
相关产品推荐

