在SQL Server中使用Count()和自联接

时间:2016-11-18 11:17:04

标签: sql-server join count self

我正在使用northwind数据库,我的练习是:

  

哪些供应商提供同一类别的两种产品?显示公司名称,类别和两个产品名称

我的代码:

SELECT DISTINCT 
    c.CategoryID, s.CompanyName, p1.ProductName, p2.ProductName
FROM 
    Suppliers s 
INNER JOIN 
    Products p1 ON s.SupplierID = p1.SupplierID
INNER JOIN 
    Products p2 ON p1.CategoryID = p2.CategoryID 
                AND p1.ProductID <> p2.ProductID
INNER JOIN 
    Categories c ON p2.CategoryID = c.CategoryID
GROUP BY 
    c.CategoryID,s.CompanyName, p1.ProductName, p2.ProductName`

如何使用COUNT()对其进行过滤?我尝试使用HAVING进行过滤,但我失败了。 我会感激一些帮助,这会让我恢复正常的方式。

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询获取两个产品的供应商/类别列表:

select supplierId, categoryId
from products
group by supplierId, categoryId
having count(*) = 2;

然后,编写查询以显示供应商和产品名称,并使用上述内容过滤该查询的结果。您可以使用exists或其他join

答案 1 :(得分:0)

根据Gordon的回答,下面的代码将获得您需要的所有数据。如果您必须将两个产品放在同一行,则可以使用pivot

select s.CompanyName
        ,p.ProductName
from Suppliers s
    -- This join filters your Suppliers table to only those with two Products in the same Category
    inner join (select SupplierID
                        ,CategoryID
                from Products
                group by SupplierID
                        ,CategoryID
                having count(1) = 2
                ) pc
        on(s.SupplierID = pc.SupplierID)

    -- This join returns the two products in the Category returned in the join above.
    inner join Products p
        on(s.SupplierID = p.SupplierID
            and pc.CategoryID = p.CategoryID
            )