2014-03-31 256 views
0

我希望我能够很好地解释这一点。SQL结果表满足两个条件

说我有这个表:

Owner 
+--------+--------+ 
| Name | Type | 
+--------+--------+ 
| Bob | Cat | 
| Bob | Dog | 
| Bob | Cow | 
| Tim | Dog | 
| Tim | Cat | 
| Ted | Cat | 
| Joe | Dog | 
| Joe | Cat | 
| Joe | Sheep | 
+--------+--------+ 

我试图找到大家谁拥有所有的动物添了(这么一只猫和一只狗)。这意味着乔和鲍勃会满足这一点,但不是泰德,因为他只有一种动物蒂姆有

我将如何去获得这个结果?

所以我必须与所有蒂姆拥有该类型的表:

SELECT Type FROM Owner WHERE Name= 'Tim'; 

我如何得到它,这样只有那些谁拥有这两种类型的蒂姆已经获得来自所有者的列表中选择?

任何指导将不胜感激,在此先感谢。

回答

0
select name 
from owner 
where type in (select distinct type from owner where name = 'tim') 
group by name 
having count(distinct type) = (select count(distinct type) from owner where name = 'tim') 
0

如果你只是试图让所有谁比添has更多的动物的人,那么你可以不喜欢它

select Name from owners 
group by Name 
having count(distinct [Type]) > (select count(distinct type) from owners 
where Name='tim') 
0

我认为这是一个joingroup by问题。将Tim的记录加入所有其他所有者,但在type字段中。然后做一个汇总,只保留记录,所有的type的比赛:

select o.name 
from owner otim left join 
    owner o 
    on o.type = tim.type and o.name <> 'Tim' and otim.name = 'Tim' 
group by o.name 
having min(case when o.type is null then 0 else 1 end) = 0; 

注意,当重复type值是允许在这张桌子也可使用。