在Oracle 11g中,我有一张桌子,宠物。宠物有两列,所有者和类型。表中唯一的宠物类型是狗,猫和鱼。
有些老板有两只宠物。
我想选择所有拥有猫狗的主人。 我怎么能这样做?
答案 0 :(得分:2)
各种不同的方法,这里有一个:
select owner from pets where type = 'CAT'
intersect
select owner from pets where type = 'DOG'
INTERSECT操作员生成一组猫和狗的不同所有者。
答案 1 :(得分:1)
您可以使用GROUP BY
和HAVING
:
SELECT t.owner
FROM tab t
WHERE t.type IN ('dog', 'cat')
GROUP BY t.owner
HAVING COUNT(DISTINCT t.type) = 2;
答案 2 :(得分:0)
想象一下这样的表:
|owner || type|
-----------------
|own1 | dog |
|own1 | cat |
|own2 | dog |
|own3 | dog |
|own3 | fish|
您可以尝试这样的事情:
select o.cat_and_dog_owner
from(
select t.owner as cat_and_dog_owner, sum(case when t.type = 'dog' then 1 else 0 end) as dog_cnt, sum(case when t.type = 'cat' then 1 else 0 end) as cat_cnt
from table t
where t.type in ('dog', 'cat')
group by t.owner
having (sum(case when t.type = 'dog' then 1 else 0 end) > 0) and (sum(case when t.type = 'cat' then 1 else 0 end) > 0)
) o
基本上你只想选择猫狗记录。我们结合使用sum
和case
来计算按所有者分组的狗和猫的数量。最后,我们检查having
子句以确保我们只获得两列中的计数大于0的记录。