【问题标题】:SQL one-to-many relationship, how to select parent containing unique set of childrenSQL一对多关系,如何选择包含唯一子集的父
【发布时间】:2010-09-15 00:55:11
【问题描述】:

我有一个常规的一对多模式,类似于这个简单的例子:


person_id (PK)

PERSON_TRAIT
person_id (FK)
trait_id (FK)
数量

特质
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。

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    这将为您提供仅具有指定的两个特征的人的列表。

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

    【讨论】:

    • 这导致了我最初偶然发现的相同问题。也就是说,如果我有一个人具有“友好、有趣、聪明”这 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
    

    having 数字更改为要选择的不同名称的数量 - 因此,如果需要“友好”、“有趣”和“聪明”,请将 Have 子句更改为 having count(distinct name) = 3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多