sql连接到桥接表的每一行(筛选)

oymdgrw7  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(266)

在相当于amazon产品过滤器的情况下,我有来自前端的产品分类id作为id表。每种产品可以有许多分类。与我的网桥表(productId和classificationId)的普通联接返回具有这些ID中任何一个的产品。然而,我想只返回那些产品,有所有的ID,从而满足所有客户的愿望。而不是手术室。我该怎么做?
例如,这是与分类ID的测试数据的典型连接:

DECLARE @ClassifcationIds dbo.IdsTableNullable
INSERT INTO @ClassificationIds (Id) 
VALUES (1),(2),(3)

 SELECT DISTINCT 
              Id
              Description
        FROM dbo.Products as P
             JOIN dbo.ProductClassification AS Pc ON P.Id = Pc.ProductId
             JOIN @ClassifcationIds AS C ON C.Id = Pc.ClassificationId;

这将返回分类ID为1、2或3的产品。我只想要三个都有的产品。将桥接表连接到第一个id上,然后将结果表连接到下一个id上,依此类推,直到结果产品具有所有3个分类id,这是什么等效方法?

f4t66c6m

f4t66c6m1#

使用 group by 以及 having :

SELECT p.Id, p.Description
FROM dbo.Products P JOIN
     dbo.ProductClassification Pc
     ON P.Id = Pc.ProductId JOIN
     @ClassifcationIds C
     ON C.Id = Pc.ProductId
GROUP BY p.Id, p.Description
HAVING COUNT(*) = (SELECT COUNT(*) FROM @ClassifcationIds);

相关问题