2010-07-26 3 views
1

Étant donné un modèle comme celui alt textSql Server 2008 Sélectionnez de la table avec et conditions de style dans les tableaux connexes

ProductFacets contient les données suivantes:

ProductId, FacetTypeId 
1, 1 
1, 2 
2, 1 
2, 3 
3, 4 
3, 5 
4, 1 
4, 2 

Je voudrais être en mesure de sélectionner tous Les produits qui ont une FacetTypeId de 1 eT 2. Le jeu de résultats doivent contenir ProductIds 1 et 4

+0

Pourquoi/2 devrait pas être inclus dans le jeu de résultats de 1, 4? (Notez le ProductID, FacetTypeID de 2,1) –

+0

FacetTypeId doit être 1 et 4 (Qu'en est-il des produits qui peuvent avoir 1, 4 et 2) –

+0

Pensez-y comme un filtre où nous voulons seulement les produits avec FACETTypeId 1 et 2 . –

Répondre

1

Cela retournera des lignes pour les produits qui ont seulement les types de facettes 1 et 2, et seulement ces facettes.

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 
; 
0
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 
) 

) 

Là mu sois un meilleur moyen de résoudre ce problème, mais c'est le seul que je peux trouver

0

Je pensais juste que d'une façon de le faire:

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) 
Questions connexes