如何检查同一对象SQL Server中是否存在同一属性的多个值

如何检查同一对象SQL Server中是否存在同一属性的多个值,sql,sql-server,Sql,Sql Server,我有三张桌子:产品、PRO_FAB和面料。Products表有Product_ID和Name,PRO_FAB有PRO_FAB_ID,Product_ID和Fabric_ID,Fabrics有Fabric_ID和Name。它们是这样联系的: Products.Product_ID --- PRO_FAB.Product_ID <-> PRO_FAB.Product_ID --- Fabrics.Fabric_ID. Products.Product\u ID---PRO\u FAB.

我有三张桌子:产品、PRO_FAB和面料。Products表有Product_ID和Name,PRO_FAB有PRO_FAB_ID,Product_ID和Fabric_ID,Fabrics有Fabric_ID和Name。它们是这样联系的:

Products.Product_ID --- PRO_FAB.Product_ID <-> PRO_FAB.Product_ID --- Fabrics.Fabric_ID.
Products.Product\u ID---PRO\u FAB.Product\u ID PRO\u FAB.Product\u ID---Fabrics.Fabric\u ID。

所以这基本上是一种m:n关系。我正在尝试进行一个查询,该查询将列出由fabrics表中的所有面料制成的产品。我尝试过使用HAVING、CONTAINS和其他方法,但似乎都不起作用,或者至少我不知道如何使用它们。感谢您的帮助。

正如Dmitri正确指出的那样,下面的查询获取的是任何面料的产品,而不是所有面料的产品(我阅读问题太快,没有花时间理解它)

Dmitri的解决方案优雅且易于理解(我确信它的性能更好,所以我投了赞成票),但我想到了另一个可行的解决方案(我确信还有更多)

如果您的SQL版本不支持公共表表达式,则可以使用内联子查询

DECLARE @TotalFabrics int
SELECT @TotalFabrics = count(*) FROM dbo.Fabrics

SELECT p.Name
FROM Products p
  INNER JOIN PRO_FAB pf ON pf.Product_ID = p.Product_ID
  INNER JOIN Fabrics f ON f.Fabric_ID = pf.Fabric_ID
GROUP BY p.Name
HAVING COUNT(f.Fabric_ID) = @TotalFabrics
如果您正在寻找使用所有面料的产品,这应该是可行的。我很想看看人们会想出什么其他方法


如果需要,您也可以使用子查询替换@TotalFabrics,但我认为这更简洁。

这不会得到使用“所有”结构的产品,而只得到使用“任何”结构的产品。很好!我知道这是因为有:D非常感谢:D
;with cte as
(
  SELECT     Products.Product_ID, Fabrics.Fabric_ID
  FROM         Fabrics CROSS JOIN Products
)
Select Products.Name
FROM Products
WHERE Product_ID 
NOT IN(SELECT cte.Product_ID
       FROM cte
            LEFT OUTER JOIN PRO_FAB
              ON cte.Fabric_ID = PRO_FAB.Fabric_ID
              AND PRO_FAB.Product_ID = cte.Product_ID
       WHERE PRO_FAB_ID IS NULL)
DECLARE @TotalFabrics int
SELECT @TotalFabrics = count(*) FROM dbo.Fabrics

SELECT p.Name
FROM Products p
  INNER JOIN PRO_FAB pf ON pf.Product_ID = p.Product_ID
  INNER JOIN Fabrics f ON f.Fabric_ID = pf.Fabric_ID
GROUP BY p.Name
HAVING COUNT(f.Fabric_ID) = @TotalFabrics