如何为每个用户选择包含两个值之一的所有条目?

时间:2017-11-30 19:40:31

标签: sql oracle oracle11g

在Oracle 11g中,我有一张桌子,宠物。宠物有两列,所有者和类型。表中唯一的宠物类型是狗,猫和鱼。

有些老板有两只宠物。

我想选择所有拥有猫狗的主人。 我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

各种不同的方法,这里有一个:

select owner from pets where type = 'CAT'
intersect 
select owner from pets where type = 'DOG'

INTERSECT操作员生成一组猫和狗的不同所有者。

答案 1 :(得分:1)

您可以使用GROUP BYHAVING

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

基本上你只想选择猫狗记录。我们结合使用sumcase来计算按所有者分组的狗和猫的数量。最后,我们检查having子句以确保我们只获得两列中的计数大于0的记录。