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