You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 03:36:03