Hive 中的错误:对于 Exists/Not Exists 运算符,子查询必须是相关的

Posted

技术标签:

【中文标题】Hive 中的错误:对于 Exists/Not Exists 运算符,子查询必须是相关的【英文标题】:Error in Hive : For Exists/Not Exists operator SubQuery must be Correlated 【发布时间】:2018-08-09 12:33:11 【问题描述】:
select * from students1;

students1.name  students1.age   students1.gpa
fred    35  1.28
barney  32  2.32
shyam   32  2.32

select * from students2;
students1.name  students1.age
fred    35
barney  32

当我运行这个查询时

select 
name,age from students1
where not exists
(select name,age from students2);

我收到了以下错误

编译语句时出错:FAILED: SemanticException line 39:22 子查询 sq_1 [ 的定义中的子查询表达式“年龄”无效 exists (select name,age from students2) ] 在第 3:10 行用作 sq_1: 对于 Exists/Not Exists 运算符,子查询必须是相关的。

【问题讨论】:

【参考方案1】:

错误信息很清楚。使用exists/not exists时,子查询应该是关联的。

select name,age 
from students1 s1
where not exists (select 1
                  from students2 s2
                  where s1.name=s2.name and s1.age=s2.age
                 )

【讨论】:

这个1是什么意思 没有简单的方法来实现这一点,因为我必须编写查询来比较源表和目标表之间的数据 如果我有 100 列,那么我将不得不写 s1.x=s2.x 和 s1.a=s2.b .... 就像 100 列一样明智 @Kumar 1 只是一个任意值,因为我们唯一需要的是子查询返回一个值,无论如何。【参考方案2】:

您正在尝试实现查询的MINUS 输出。它很遗憾在 Hive 中不可用

您可以在此处阅读 HQL 和 SQL 的限制。 HQL vs SQL

对于不存在的用法,手册中有很好的例子。 subqueries in hive

【讨论】:

以上是关于Hive 中的错误:对于 Exists/Not Exists 运算符,子查询必须是相关的的主要内容,如果未能解决你的问题,请参考以下文章

SQL in/not in/exists/not exists

oracle_not exists和not in的用法和区别

Oracle,用left join 替代 exists ,not exists,in , not in,提高效率

随笔57 sql语句中in与exists,not in与not exists的区别

Oracle-where exists()not exists() in()not in()用法以及效率差异

遇到“错误无法更改表”。当改变 Hive 中的表列位置时