【问题标题】:How can I get particular product if in all category?如果在所有类别中,我如何获得特定产品?
【发布时间】:2013-03-17 11:16:54
【问题描述】:

我有如下表格

类别表

╔════╦═══════╗
║ ID ║ NAME  ║
╠════╬═══════╣
║  1 ║ cat 1 ║
║  2 ║ cat 2 ║
║  3 ║ cat 3 ║
╚════╩═══════╝

产品表

╔════╦════════════╦═════════════╗
║ ID ║ CATEGORYID ║ PRODUCTNAME ║
╠════╬════════════╬═════════════╣
║  1 ║          1 ║ product1    ║
║  2 ║          1 ║ product2    ║
║  3 ║          1 ║ product3    ║
║  4 ║          2 ║ product1    ║
║  5 ║          2 ║ product2    ║
║  6 ║          3 ║ product1    ║
║  7 ║          3 ║ product3    ║
╚════╩════════════╩═════════════╝

输出表

╔════╦════════════╦═════════════╗
║ ID ║ CATEGORYID ║ PRODUCTNAME ║
╠════╬════════════╬═════════════╣
║  1 ║          1 ║ product1    ║
║  4 ║          2 ║ product1    ║
║  6 ║          3 ║ product1    ║
╚════╩════════════╩═════════════╝

每个类别都有一个产品名称“product1”,所以我需要一个所有类别中可用的产品列表。

谁能帮助我如何使用 SQL Server T-SQL 查询?

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:
    SELECT  a.*
    FROM    Product a
            INNER JOIN
            (
                SELECT  ProductName
                FROM    Product
                GROUP   BY ProductName
                HAVING  COUNT(DISTINCT CategoryID) = (SELECT COUNT(*) FROM Category)
            ) b ON a.ProductName = b.ProductName
    

    输出

    ╔════╦════════════╦═════════════╗
    ║ ID ║ CATEGORYID ║ PRODUCTNAME ║
    ╠════╬════════════╬═════════════╣
    ║  1 ║          1 ║ product1    ║
    ║  4 ║          2 ║ product1    ║
    ║  6 ║          3 ║ product1    ║
    ╚════╩════════════╩═════════════╝
    

    【讨论】:

      【解决方案2】:

      试试:

      with cte as
      (select p.*, count(*) over (partition by PRODUCTNAME) cats
       from product p)
      select ID, CATEGORYID, PRODUCTNAME
      from cte p
      join (select count(*) totcats from category) c
      on p.cats=c.totcats
      

      【讨论】:

      • 这应该在 sqlserver 2005、2008 和 2012 上运行 - 例如:sqlfiddle.com/#!3/65e78/11
      • 是的,你是对的。我之前打错字了,所以我才告诉你这件事。对不起。删除我的旧评论。
      【解决方案3】:

      带有NOT EXISTSEXCEPT 运算符的选项

      SELECT *
      FROM dbo.Product p
      WHERE NOT EXISTS (
                        SELECT p3.[ID]
                        FROM dbo.Category p3                  
                        EXCEPT
                        SELECT p2.[CAtegoryID]
                        FROM dbo.Product p2
                        WHERE p2.[productName] = p.[productName]                        
                        ) 
      

      SQLFiddle上的演示

      为了提高性能,请使用此索引

      CREATE INDEX ix_ID_Category ON Category(ID)
      

      【讨论】:

        【解决方案4】:

        通过存在

        SELECT  a.*
        FROM    Product a
        where exists
                (
                    SELECT  1
                    FROM    Product
                    where a.ProductName = Product.ProductName
                    HAVING  COUNT(DISTINCT CategoryID) = (SELECT COUNT(*) FROM Category)
                ) 
        

        【讨论】:

          猜你喜欢
          • 2021-08-12
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多