如何查询售卖全部顶级品牌的经销商(基于SQL视图)
解决方案:找出售卖所有顶级品牌的经销商
要实现同时售卖top_brands视图中所有品牌的经销商查询,你之前的方法核心问题是没有建立经销商与顶级品牌的关联匹配,以下是两种可行的方案:
方案1:分组计数匹配法
通过统计每个经销商覆盖的顶级品牌数量,与顶级品牌的总数量对比,相等则说明该经销商覆盖了所有顶级品牌:
SELECT dealership FROM dealership_sells JOIN top_brands ON dealership_sells.name = top_brands.name GROUP BY dealership HAVING COUNT(DISTINCT top_brands.name) = (SELECT COUNT(*) FROM top_brands);
逻辑说明:
JOIN top_brands先筛选出经销商售卖的所有顶级品牌记录- 按
dealership分组后,统计该经销商覆盖的不同顶级品牌数量 HAVING子句判断这个数量是否等于top_brands的总品牌数,确保没有遗漏任何顶级品牌
方案2:双重NOT EXISTS反证法
通过反向验证:不存在任何一个顶级品牌是该经销商未售卖的,即可证明该经销商覆盖所有顶级品牌:
SELECT DISTINCT ds.dealership FROM dealership_sells ds WHERE NOT EXISTS ( -- 检查是否存在某个顶级品牌,当前经销商没有售卖 SELECT 1 FROM top_brands tb WHERE NOT EXISTS ( SELECT 1 FROM dealership_sells ds2 WHERE ds2.dealership = ds.dealership AND ds2.name = tb.name ) );
逻辑说明:
- 内层
NOT EXISTS检查某顶级品牌是否不在当前经销商的售卖列表中 - 外层
NOT EXISTS确保不存在这样的品牌,即所有顶级品牌都被该经销商覆盖
你之前方法的问题分析
- 你的
EXISTS查询没有关联dealership_sells和top_brands,只要top_brands不为空,所有经销商都会被返回,等价于无条件筛选 - 使用
IN时,逻辑是只要售卖任意一个顶级品牌就返回,所以会包含只卖Ford的经销商A ALL的用法错误:如果用name = ALL(SELECT name FROM top_brands),是要求单条记录的品牌同时等于所有顶级品牌,这显然不可能,所以无法得到正确结果
内容的提问来源于stack exchange,提问作者Rayyan Khan
相关产品推荐
相关产品推荐

