在SQL中要求列包含每个指定值的更好方法

Cra*_*uin 3 sql select one-to-many

想象一下,你有两张桌子,有一对多的关系.

对于这个例子,我建议有两个表:Person和Homes.人员表中包含人员姓名,并为其提供身份证明.家庭表,持有一个人的家庭协会.PID加入"Person.ID"

而且,在这个小小的数据库中,一个人可以没有家,也没有许多家.

在此输入图像描述

我希望我把它画好.

我怎样写一个选择,返回每个人每个指定的户型?

假设这些是homes表中有效的"类型":

小屋,主楼,大厦,太空港.

我想在Person表中返回所有人,他们有一个太空港一个小屋.

我能想出的最好的是:

SELECT DISTINCT( p.name ) AS name
FROM person p
    INNER JOIN homes h ON h.pid = p.id
WHERE 'spaceport' in (
    SELECT DISTINCT( type ) AS type
    FROM homes
    WHERE pid = p.id
)
AND 'cottage' in (
    SELECT DISTINCT( type ) AS type
    FROM homes
    WHERE pid = p.id
)
Run Code Online (Sandbox Code Playgroud)

当我写这篇文章时,它有效,但我很确定必须有更好的方法.

Joe*_*lli 9

这里的HAVING条款将保证返回的人有两种类型,而不仅仅是其中一种.

SELECT p.name
    FROM person p
        INNER JOIN homes h
            ON p.id = h.pid
                AND h.type IN ('spaceport', 'cottage')
    GROUP BY p.name
    HAVING COUNT(DISTINCT h.type) = 2
Run Code Online (Sandbox Code Playgroud)