首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择每个用户包含两个值之一的所有条目?

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

Stack Overflow用户
提问于 2017-11-30 19:40:30
回答 3查看 47关注 0票数 0

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

有些主人有两只宠物。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-30 19:44:18

做这件事有很多不同的方法,这里有一种:

代码语言:javascript
复制
select owner from pets where type = 'CAT'
intersect 
select owner from pets where type = 'DOG'

INTERSECT产生了一组猫和狗的不同主人。

票数 2
EN

Stack Overflow用户

发布于 2017-11-30 20:03:05

你可以用GROUP BYHAVING

代码语言:javascript
复制
SELECT t.owner
FROM tab t
WHERE t.type IN ('dog', 'cat')
GROUP BY t.owner
HAVING COUNT(DISTINCT t.type) = 2;
票数 1
EN

Stack Overflow用户

发布于 2017-11-30 19:58:18

想象一张这样的桌子:

代码语言:javascript
复制
|owner  ||  type|
-----------------
|own1   |   dog |
|own1   |   cat |
|own2   |   dog |
|own3   |   dog |
|own3   |   fish|

你可以试试这样的方法:

代码语言:javascript
复制
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的记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47581378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档