首页 > 代码库 > sql中的exist in在hive中的用法

sql中的exist in在hive中的用法

Hive不支持where子句中的子查询,SQL常用的exist in子句需要改写。

 

这一改写相对简单。考虑以下SQL查询语句: 

SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B);

改写成:

SELECT a.key, a.value FROM a LEFT OUTER JOIN b ON (a.key = b.key) WHERE b.key <> NULL;

解释:先做左连接,结果形如:

aaa  111

bbb  222

ccc   null

ddd  null

然后再过滤掉key为null的,剩下的就是表a的key在表b中存在的。

 

一个更高效的实现是利用left semi join改写为:

SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key);

限制条件:JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。