SQL отношение один ко многим, как выбрать родителя, содержащего уникальный набор потомков - PullRequest
1 голос
/ 15 сентября 2010

У меня есть обычная схема «один ко многим», подобная этому простому примеру:

PERSON
person_id (PK)

PERSON_TRAIT
person_id (FK)
trait_id (FK)
количество

TRAIT
trait_id (PK)
Имя
// другие атрибуты

С учетом набора признаков («дружелюбный, смешной»), как бы я возвращал связанный набор person_id и количества записей.

На первый взгляд я испытал желание использовать это, но это не так просто:

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

Это не правильно, потому что у меня мог быть человек, у которого есть эти черты плюс еще ("дружелюбный, смешной, худой"), и он был бы возвращен.

Если сделать еще один шаг вперед, если нет человека, который точно содержит все черты, как бы я суммировал черты от нескольких разных людей и возвратил набор записей этих значений person_id и количества?

Использование SQL Server 2005.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2010

Попробуйте:

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

Измените число having на количество отдельных имен, которые будут выбраны - поэтому, если требуются «дружелюбный», «смешной» и «умный», измените предложение, имеющее having count(distinct name) = 3.

0 голосов
/ 15 сентября 2010

Это даст вам список людей, у которых есть только две указанные черты.

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)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...