前段时间在脚本开发的过程中,遇到了一个问题,就是not in查询出来的结果,代码分段查询是有结果的,但是通过not in查询出来却不存在,试了好几种办法以及百度查询了一下,最后发现了真正的原因,在这里分享给大家,给大家也避避雷。
not in 没有查询出来的主要原因,还是因为Hive 不支持 where 子句中的子查询,所以not in的SQL语句是需要改写的,可以改写成not exists ,或者是left join 。
CREATE TABLE test.in_test1
(
id varchar(10)
,name varchar(10)
,sex varchar(10)
,age varchar(10)
);
CREATE TABLE test.in_test2
(
id varchar(10)
,name varchar(10)
,class varchar(10)
,school varchar(10)
);
INSERT INTO test.in_test1 VALUES
('1','xiaoming','1','17'),
('2','xiaohua','0','23'),
('3','jack','1','12'),
('4','rose','0','28'),
('5','jenny','0','45'),
('6','judy','0','10'),
('7','wangwu','1','35')
;
INSERT INTO test.in_test2 VALUES
('1','xiaoming','3','花花高中'),
('2','xiaohua','5','北京大学'),
('3','jack','2','新民中学'),
('4','rose','1','清华大学')
;
SELECT * FROM test.in_test1;
SELECT * FROM test.in_test2;
SELECT * FROM test.in_test1 test1
WHERE 1=1
AND NOT exists (SELECT * FROM test.in_test2 test2 WHERE test1.name = test2.name)
SELECT test1.*
FROM test.in_test1 test1
LEFT JOIN test.in_test2 test2
ON test1.name = test2.name
WHERE 1=1
AND test2.name IS NULL