SQL一对多关系,如何选择包含唯一子项集的父项
我有一个常规的一对多模式,类似于这个简单的示例: 人SQL一对多关系,如何选择包含唯一子项集的父项,sql,sql-server-2005,Sql,Sql Server 2005,我有一个常规的一对多模式,类似于这个简单的示例: 人 个人识别码(PK) 个人特质 个人识别码(FK) 特征id(FK) 数量 特质 特质识别码(PK) 名称 //其他属性 给定一组特征(“友好、有趣”),我如何返回关联人员id和数量记录集 乍一看,我很想用这个,但不是这么简单: select person_id, quantity from trait t inner join person_trait pt on t.trait_id = pt.trait_id where na
个人识别码(PK) 个人特质
个人识别码(FK)
特征id(FK)
数量 特质
特质识别码(PK)
名称
//其他属性 给定一组特征(“友好、有趣”),我如何返回关联人员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和quantity值的记录集
使用SQL Server 2005。这将为您提供仅具有所示两种特征的人员列表
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)
)
尝试:
将
having
number更改为要选择的不同名称的数量-因此,如果需要“友好”、“有趣”和“聪明”,则将having子句更改为having count(distinct name)=3
,这导致了我最初遇到的相同问题。也就是说,如果我有一个人有3个特征“友好、有趣、聪明”,另一个人有2个特征“友好、有趣”,并且我在“友好、有趣”上运行查询,那么这两个人都会被返回。
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