SQL搜索仅提供两种不同产品的供应商

SQL搜索仅提供两种不同产品的供应商,sql,Sql,这是一个使用子查询的家庭作业问题,教授给出的最接近的例子没有那么大帮助。我们基本上有一个大的产品表,其中有相关的行ProductID、SupplierID、CategoryID。 我需要编写一个查询,返回恰好提供两类商品的所有供应商 我有类似的东西 select Products.SupplierID, CompanyName, Products.CategoryID, CategoryName from Products join Categories ON Products

这是一个使用子查询的家庭作业问题,教授给出的最接近的例子没有那么大帮助。我们基本上有一个大的产品表,其中有相关的行
ProductID、SupplierID、CategoryID
。 我需要编写一个查询,返回恰好提供两类商品的所有供应商

我有类似的东西

select Products.SupplierID, CompanyName, Products.CategoryID, CategoryName
    from Products 
    join Categories ON Products.CategoryID = Categories.CategoryID
    join SUPPLIERS ON Products.SupplierID = Suppliers.SupplierID
    where Products.SupplierID = ANY (select top 3 with ties Products.SupplierID
                              from Products
                              group by Products.SupplierID
                              order by count(*) desc);
就拿例子来说,where语句是不对的,我真的不知道从哪里开始。我不是要求任何人帮我解决这个问题,但如果你能为我指出正确的方向,我将不胜感激

SELECT
    SupplierId
FROM
    Products
GROUP BY
    SupplierId
HAVING
    COUNT(DISTINCT CategoryID) = 2
如果您不需要实际的类别,您可以使用带有GROUPBY和
HAVING
子句的简单聚合。拥有的
就像一个
,其中
在事实之后。因此,您还可以添加
WHERE
语句和其他内容

注意,您实际上不需要
类别
表,因为表中已经有产品id。但是,很可能您的关系有点不正常,
产品
表中没有
类别ID
,但您的
类别
表中有
产品ID
,在这种情况下,您需要这样的内容:

SELECT
    Products.SupplierId
FROM
    Products
    INNER JOIN Categories
    ON Products.ProductId = Categories.ProductId
GROUP BY
    Products.SupplierId
HAVING
    COUNT(DISTINCT Categories.CategoryID) = 2

如果您想要实际的类别,它会变得有点复杂,但可以用与您尝试的方式没有太大区别的方式来完成。

我认为您只需要更改WHERE语句,以查找具有两个不同类别ID的供应商ID。你真的很接近了,只需删除前3名和Order by,然后在末尾添加HAVING语句,显示
COUNT(DISTINCT(Products.CatigoryID))=2


我希望这能帮助您找到需要去的地方。

您确实提到了子查询,所以下面是我的看法:

select * 
from 
    @suppliers s
    inner join(
        select 
            s.supplierid,
            count(distinct categoryid) cats
        from    
            @products p
            inner join @suppliers s on
                p.supplierid = s.supplierid
        group by
            s.supplierid
        having count(distinct categoryid) = 2
        ) supplieroftwocats on 
            s.supplierid = supplieroftwocats.supplierid

请用示例说明示例谢谢,这正是我所需要的!听你这么说太好了!alex为什么需要一个子查询以及您提供的代码如果您在所有供应商列上使用一个简单的group by,那么在没有子查询的情况下它将产生相同的结果。Matt分配实际上指定我们需要使用子查询ESTON,在Where语句中添加子查询也会起作用吗?