sql求交集与差集

日常工作中,针对两个表A,B,求A与B表中同一个字段的交集与差集是常见需求,下面我们来总结一下求交集与差集的方法。

假设现在有两张表A,B,A,B表中均有一个字段为id,现在我们想求
A与B中都存在的id有多少个(去重),在A中但不在B中的id有多少个。

1.求交集

1.1 通过join求交集

要求交集,我们最先想到的是可以通过join的方式来实现。

select count(distinct id) from A 
join B
on A.id = B.id;

常规的join操作,不解释。

1.2 通过in求交集

通过in操作实现求交集的功能。

select count(distinct id) from A where id in(select id from B);

1.3 通过exists求交集

select count(distinct id) from A where  exists(select id from B where B.id = A.id);

exists可以用来判断是否存在。如果exists中的查询内容存在,结果则返回为真,否则为假。
如果exists在where条件中,会先对where条件前的主查询进行查询。待主查询完毕以后,会将结果代入exists中的子查询进行判断,最后根据判断结果,如果为true输出,false不输出。

2.求差集

如果是求差集,join的方式就不好用了,我们可以用not in或者not exists的方式来进行操作。

2.1 not in求差集

select count(distinct id) from A where id not in(select id from B where id is not null)

2.2 not exists求差集

select count(distinct id) from A where  not exists(select id from B where B.id = A.id);

你可能感兴趣的:(hive,sql,求交集,求差集,exists,in)