【问题标题】:check if the column value exists in subquery检查子查询中是否存在列值
【发布时间】:2013-04-05 13:16:11
【问题描述】:

我有 3 个表 Product Category 和 ProductCategory。

产品表:

ProductID ProductName
1             P1
2             P2
3             P3

分类表:

CategoryID CategoryName
1              C1
2              C2
3              C3

产品类别:

ProductID CategoryID
1            1
1            2
1            3
2            3
3            1
3            2

我需要一个返回超过 1 个类别的产品的查询。根据上面的表格数据,结果将是:

ProductID     ProductName
    1             P1
    3             P3  

所以我写了一个查询来获取所有具有多个 CategoryID 的 ProductID,如下所示:

select ProductID,count(CategoryID)    
from ProductCategory   
group by Productid   
having count(CategoryID)>1)  

但是当我尝试使用以下查询显示产品详细信息时,我得到一个错误:

select *
from Product
where ProductID in (
    select ProductID,count(CategoryID)  
    from ProductCategory 
    group by Productid 
    having count(CategoryID)>1))

我的查询错了吗?我如何获得属于多个类别的所需产品详细信息?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    删除子查询中的COUNT()。在IN 子句上使用时,子查询的结果必须只有一个返回列。

    SELECT  *
    FROM    Product
    WHERE   ProductID IN 
            (
                SELECT  ProductID
                FROM    ProductCategory
                GROUP   BY Productid
                HAVING  count(CategoryID) > 1
            ) 
    

    或使用JOIN

    SELECT  a.*
    FROM    Product a
            INNER JOIN 
            (
                SELECT  ProductID
                FROM    ProductCategory
                GROUP   BY Productid
                HAVING  count(CategoryID) > 1
            ) b ON a.ProductID = b.ProductID
    

    【讨论】:

    • 感谢您的帮助
    【解决方案2】:

    您可以尝试在 SQL Server 中使用 CROSS APPLY 运算符

    SELECT DISTINCT C.ProductID,C.ProductName,A.CategoryID,A.Total
    FROM Product C
    CROSS APPLY (
        Select CA.CategoryID,Total=COUNT(*)
        From ProductCategory CA
        Where C.ProductID=CA.ProductID
        Group By CA.CategoryID Having COUNT(*)>1
    ) AS A
    ORDER BY A.Total DESC
    

    看一看:http://explainextended.com/2009/07/16/inner-join-vs-cross-apply/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多