MS Access查询供应所有零件的供应商名称的SQL优化问题
问题解答
原SQL失效原因
你写的查询中WHERE条件的两个判断均为恒成立逻辑,没有实现「筛选供应所有零件的供应商」的效果:
- 第一个
IN子查询取的是当前关联供应商自己供应的零件ID,和关联出来的SPB.Part本身就是同范围数据,判断永远为真 - 第二个
IN子查询返回所有零件表的ID,只要SPB表的Part字段是合法关联值,判断也永远为真
最终原SQL只会返回所有供应商和其已供应零件的关联记录,没有筛选作用。
适配MS Access的正确SQL
推荐使用兼容性更好的双重否定逻辑实现关系除法,所有Access版本均支持:
SELECT DISTINCT Suppliers.Name FROM Suppliers WHERE NOT EXISTS ( SELECT 1 FROM Parts WHERE NOT EXISTS ( SELECT 1 FROM SPB WHERE SPB.Supplier = Suppliers.ID AND SPB.Part = Parts.ID ) )
逻辑说明
查询逻辑等价于:找不存在「任意一个零件,该供应商没有供应」的供应商,刚好匹配「供应所有零件」的需求。
如果你的Access版本支持COUNT(DISTINCT),也可以用计数对比的写法,可读性更强:
SELECT Suppliers.Name FROM Suppliers WHERE ( SELECT COUNT(DISTINCT SPB.Part) FROM SPB WHERE SPB.Supplier = Suppliers.ID ) = (SELECT COUNT(ID) FROM Parts)
内容的提问来源于stack exchange,提问作者Kosarar
相关产品推荐
相关产品推荐

