我有一个例行的一对多架构,类似于这个简单的例子:
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。
答案 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
。