如何检查同一对象SQL Server中是否存在同一属性的多个值
我有三张桌子:产品、PRO_FAB和面料。Products表有Product_ID和Name,PRO_FAB有PRO_FAB_ID,Product_ID和Fabric_ID,Fabrics有Fabric_ID和Name。它们是这样联系的:如何检查同一对象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.
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