所有人都没有按预期工作

时间:2017-12-27 11:38:41

标签: sql oracle

如果他有A类和B类信用卡,我想找到员工的详细信息

表结构类似于{empid, ccno, cctype},并假设empid' e1'有所有卡类型。

我试过像

这样的东西
select * from test where cctype = all('A', 'B') and empid = 'e1'

但这并没有返回任何行。

你能解释一下我错的原因吗?任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:6)

ALL有效地扩展为布尔and。您的查询等同于:

select * 
  from test
 where cctype = 'A'
   and cctype = 'B'
   and empid = 'e1'

由于cctype不能同时为A B,否则不会返回任何行。

平等检查(=)对ALL很少有用,比较运算符(><<>)更有用。

如果您想找到同时拥有这两种类型的个人,您必须对密钥使用聚合或分析功能:

select empid
  from test
 where cctype in ('A', 'B')
 group by empid
having count(distinct cctype) = 2

select *
  from ( select t.*
              , count(distinct cctype) over (partition by empid) as ct
           from test t
          where cctype in ('A', 'B')
                )
 where ct = 2