ProductId, FacetTypeId
1, 1
1, 2
2, 1
2, 3
3, 4
3, 5
4, 1
4, 2
我希望能够选择所有其具有的1和2 一个FacetTypeId产品的结果集应包含ProductIds 1和4
ProductId, FacetTypeId
1, 1
1, 2
2, 1
2, 3
3, 4
3, 5
4, 1
4, 2
我希望能够选择所有其具有的1和2 一个FacetTypeId产品的结果集应包含ProductIds 1和4
这将返回仅包含方面类型1和2的产品的行,并且仅包含那些方面。
SELECT ProductId,
COUNT(*) AS FacetCountByProduct,
SUM(CASE WHEN FacetTypeId in (1, 2) THEN 1 ELSE 0 END) AS FacetCountSelectedFacets
FROM ProductFacets
GROUP BY ProductId
HAVING COUNT(*) = 2
and SUM(CASE WHEN FacetTypeId in (1, 2) THEN 1 ELSE 0 END) = 2
;
SELECT * FROM Product PROD WHERE PROD.ProductId IN(
SELECT P.ProductId pId FROM ProductFacets AS P
WHERE P.FacetTypeId = 1
AND EXISTS
(
SELECT *
FROM ProductFacets AS P1
WHERE P1.FacetTypeid = 2
AND P1.ProductId = pId
)
AND NOT EXISTS
(
SELECT *
FROM ProductFacets AS P2
WHERE P2.FacetTypeid NOT IN (1,2)
AND P2.ProductId = pId
)
)
有亩st是一个更好的方法来解决这个问题,但它是唯一一个我可以想出的
只是想到了一个办法做到这一点:
select distinct ProductId from ProductFacets
where ProductId in (select ProductId from ProductFacets where FacetTypeId = 1)
and ProductId in (select ProductId from ProductFacets where FacetTypeId = 2)
为什么/ 2应该不包括在结果集中的1,4? (请注意ProductID,FacetTypeID为2,1) – 2010-07-26 17:35:57
FacetTypeId必须是1和4(可能有1,4和2的产品怎么样) – 2010-07-26 17:44:58
可以把它想象成一个过滤器,我们只希望带有BOTH FacetTypeId 1和2的产品。 – 2010-07-26 19:02:03