2010-09-15 5 views
1

j'ai une routine d'un à plusieurs schéma, semblable à cet exemple simple:SQL un à plusieurs, comment sélectionner des parents contenant ensemble unique d'enfants

PERSONNE
person_id (PK)

PERSON_TRAIT
person_id (FK)
trait_id (FK)

quantité

TRAIT
trait_id (PK)
Nom
// autres attributs

Étant donné un ensemble de traits ("amical, drôle"), comment pourrais-je retourner le person_id associé et la quantité d'enregistrements.

À première vue, je suis tenté d'utiliser cela, mais il est pas simple:

select person_id, quantity 
from trait t 
inner join person_trait pt on t.trait_id = pt.trait_id 
where name in ('friendly', 'funny') 

Ce n'est pas correct parce que je pourrais avoir une personne qui contient ces traits plus plus («amical, drôle, maigre ") et il serait retourné. Pour aller plus loin, s'il n'y a pas une personne qui contient exactement tous les traits, comment agréger les traits de plusieurs personnes différentes et retourner un ensemble d'enregistrements de ces valeurs person_id et quantity?

Utilisation de SQL Server 2005.

Répondre

0

Cela vous donnera une liste de personnes qui ont seulement deux traits indiqués.

SELECT person_id, quantity 
FROM PERSON_TRAIT 
WHERE person_id IN 
    (
    SELECT person_id 
    FROM PERSON_TRAIT pt 
    LEFT OUTER JOIN TRAIT t ON pt.trait_id = t.trait_id 
     AND t.name IN ('friendly','funny') 
    GROUP BY person_id 
    HAVING COUNT(*) = COUNT(t.trait_id) 
    ) 
+0

Cela a abouti à la même question que je suis tombé sur. C'est-à-dire, si j'ai une personne avec les 3 traits "amical, drôle, intelligent" et une autre personne avec les 2 traits "amical, drôle" et je cours la requête sur "amical, drôle", les deux personnes sont retournées. – janusti

0

Essayez:

select person_id, sum(quantity) 
from trait t 
inner join person_trait pt on t.trait_id = pt.trait_id 
where name in ('friendly', 'funny') 
having count(distinct name) = 2 

Modifier le nombre having pour être le nombre de noms distincts à choisir - si « amical », « drôle » et « intelligent » sont nécessaires, changer l'ayant clause à être having count(distinct name) = 3.

Questions connexes