如果他有A类和B类信用卡,我想找到员工的详细信息。
表结构类似于{empid, ccno, cctype}
,并假设empid
' e1'有所有卡类型。
我试过像
这样的东西select * from test where cctype = all('A', 'B') and empid = 'e1'
但这并没有返回任何行。
你能解释一下我错的原因吗?任何帮助表示赞赏。提前谢谢。
答案 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