【问题标题】:Find the names of the suppliers who supply all the parts in MS Access在 MS Access 中查找提供所有部件的供应商的名称
【发布时间】:2021-10-12 02:17:12
【问题描述】:

我有三张桌子:

SPB (ID, Part, Supplier), Suppliers (ID, Name), Parts (ID, Part)

我想在 MS Access 中查找提供所有部件的供应商的名称。

这段代码不能正常工作:

SELECT Suppliers.ID, Parts.ID
FROM Suppliers INNER JOIN (Parts INNER JOIN SPB ON Parts.ID = SPB.Part) ON Suppliers.ID = SPB.Supplier
WHERE 
 SPB.Part IN 
 (SELECT SPB.Part
 FROM SPB
 WHERE Suppliers.ID = SPB.Supplier)
AND
 SPB.Part IN 
 (SELECT Parts.ID
 FROM Parts
 WHERE Parts.ID)

还有什么可以做得更好?

【问题讨论】:

    标签: sql ms-access join group-by count


    【解决方案1】:

    假设 SPB 每个供应商/零件对有一行,那么您可以计算:

    select supplier
    from spb
    group by supplier
    having count(*) = (select count(*) from parts);
    

    如果您可以有重复的供应商/零件对,则只需在检查之前删除重复项:

    select supplier
    from (select distinct supplier, part
          from spb
         ) as sp
    group by supplier
    having count(*) = (select count(*) from parts);
    

    【讨论】:

    • 非常机智。 “煮沸。”
    【解决方案2】:

    您需要 SuppliersPartsCROSS 连接以及 LEFT 连接到 SPB
    然后按供应商分组并在 HAVING 子句中设置条件:

    SELECT t.supplierID, t.name
    FROM (
      SELECT s.ID AS supplierID, s.name, p.Id AS part_ID
      FROM Suppliers AS s, Parts AS p
    ) AS t LEFT JOIN SPB AS b ON b.Supplier = t.supplierID AND b.Part = t.part_ID
    GROUP BY t.supplierID, t.name
    HAVING COUNT(*) = COUNT(b.Part)
    

    【讨论】:

    • 具有不同连接的清洁解决方案。太好了。
    • @Kosarar 您的要求是返回供应商的名称。这也是我加入供应商的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多