Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL一对多关系,如何选择包含唯一子项集的父项_Sql_Sql Server 2005 - Fatal编程技术网

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