Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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_Select_One To Many - Fatal编程技术网

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

在SQL中,要求列包含每个指定值的更好方法,sql,select,one-to-many,Sql,Select,One To Many,假设您有两个具有一对多关系的表 对于这个例子,我建议有两个表:Person和Homes。 person表保存一个人的名字,并给他们一个ID。homes表保存家庭与个人的关联。PID加入到“Person.ID” 在这个小小的数据库中,一个人可能没有家,或者有很多家 我希望我画对了 如何编写一个select,返回每个指定房屋类型的所有人? 假设这些是homes表中的有效“类型”: 小屋,主屋,大厦,太空港 我想让所有人都回到Person表中,他们有一个spaceport和一间小屋 我能想到的最好的

假设您有两个具有一对多关系的表

对于这个例子,我建议有两个表:Person和Homes。 person表保存一个人的名字,并给他们一个ID。homes表保存家庭与个人的关联。PID加入到“Person.ID”

在这个小小的数据库中,一个人可能没有家,或者有很多家

我希望我画对了

如何编写一个select,返回每个指定房屋类型的所有人?

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

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

我想让所有人都回到Person表中,他们有一个spaceport和一间小屋

我能想到的最好的办法是:

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
)

当我写这篇文章时,它是有效的,但我很确定一定有更好的方法。

这里的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
要查找同时拥有别墅和豪宅的每个人的id号,请按id号分组,将输出限制为别墅和豪宅,并计算不同的类型

select person_id
from homes
where type in ('cottage','mansion')
group by person_id
having count(distinct type) = 2;

person_id
--
1
您可以在联接中使用此查询来获取person表中的所有列

select person.* 
from person
inner join (select person_id
            from homes
            where type in ('cottage','mansion')
            group by person_id
            having count(distinct type) = 2) T
on person.person_id = T.person_id;

感谢Joe指出我计数中的一个错误()

我不确定这台机器的性能,但下面是:

SELECT PID FROM (
    SELECT PID, COUNT(PID) cnt FROM (
        SELECT DISTINCT PID, Type FROM Homes 
        WHERE Type IN ('Type1', 'Type2', 'Type3')
    ) a
    GROUP BY PID
) b
WHERE b.cnt = 3

你必须在子句中动态生成你的
,以及WHERE
b.CNT
子句。

这不会返回一个拥有太空港和豪宅的人的名字吗?@Patrick:
内部连接
只查找“太空港”和“小屋”。没有任何“豪宅”记录将与该连接条件匹配。@帕特里克:还要注意计数(不同的h.type)=2,它只保证指定的两种类型。如果一个人拥有两座别墅而没有其他财产,该怎么办?您的查询将返回此人。这就是为什么您需要在
HAVING
子句中计算不同的类型,就像我在中所做的那样。
SELECT PID FROM (
    SELECT PID, COUNT(PID) cnt FROM (
        SELECT DISTINCT PID, Type FROM Homes 
        WHERE Type IN ('Type1', 'Type2', 'Type3')
    ) a
    GROUP BY PID
) b
WHERE b.cnt = 3