SQL一对多关系,如何选择包含唯一子集的父级

时间:2010-09-15 00:55:11

标签: sql sql-server-2005

我有一个例行的一对多架构,类似于这个简单的例子:

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 :(得分:0)

这将为您提供仅显示两个特征的人员列表。

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

答案 1 :(得分:0)

尝试:

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子句更改为having count(distinct name) = 3