首页 > 其他分享 >hive中in、not in不支持子查询的改写方法

hive中in、not in不支持子查询的改写方法

时间:2022-08-18 19:14:35浏览次数:76  
标签:EXISTS userid hive 查询 改写 TABLE WHERE

 Error:SemanticException [Error 10249]: Line 1:146 Unsupported SubQuery Expression 'userid': Correlating expression cannot contain unqualified column references.
 hive查询中,这个异常想必大家经常会遇到,在hive中,in、not in 是不支持子查询的,今天来看看替代的方法

先说说需求场景

我们模拟的需求,从A表查询的时候,需要在结果中过滤掉B表中的userid。
上sql

select DISTINCT userid FROM TABLE_A AS a WHERE a.dt >= '20200209' AND a.userid 
NOT IN  (SELECT DISTINCT userid FROM TABLE_B AS b WHERE b.dt >= '20200209');

这是我们的正常逻辑,使用not in 过滤掉b表中的userid。但是hive目前,in、not in 是不支持子查询的,就会报我们开始提到的那个错误:

Error:SemanticException [Error 10249]: Line 1:146 Unsupported SubQuery Expression 'userid': Correlating expression cannot contain unqualified column references

使用join进行改写

使用jion改写,应该是我们最先想到的一种方式,至于连接的方式,应该根据具体的需求具体分析吧,这里使用left jion示例一下,左联以后,加上b表userid为空的条件,就可以实现我们的需求

select DISTINCT a.userid FROM TABLE_A AS  a left JOIN  TABLE_B AS b
on a.userid=b.userid
WHERE b.userid is NULL;

使用EXISTS进行改写

其实我们还可以使用EXISTS进行改写,先上sql

select DISTINCT a.userid FROM TABLE_A AS a WHERE a.dt >= '20200209' 
AND NOT EXISTS  
(SELECT DISTINCT b.userid FROM TABLE_B AS b WHERE b.dt >= '20200209' AND a.userid = b.userid);

EXISTS的语法有时间给大家讲一下,这里就注意几点。
where后面使用NOT EXISTS 时候,不需要跟着字段

NOT IN写法

where userid NOT IN ()

NOT EXISTS写法

where userid NOT EXISTS ()
使用了 NOT EXISTS 后面就可以跟一个子查询,而过滤条件,文中是根据userid过滤的,所以这个通过userid的条件写到了子查询的where条件里面去了。

img

子查询的过滤条件
这种写法就相当于jion中的on。想实践的小伙伴可以在3A服务器上部署一套。

标签:EXISTS,userid,hive,查询,改写,TABLE,WHERE
From: https://www.cnblogs.com/htx666/p/16599790.html

相关文章

  • 【MySQL】多表查询7种SQL JOIN的实现
    目录两个表关联有这7种情况1.内连接2.左外连接3.右外连接4.A-A∩B5.B-A∩B6.满外连接7.去除交集部分两个表关联有这7种情况1.内连接SELECTemployee_id,departmen......
  • 【MySQL】合并查询结果UNION
    1.UNION合并多条SELECT语句的查询结果,两个表对应的列数和数据类型必须相同,并且相互对应。会执行去重操作。2.UNIONALL不会执行去重操作如果明确知道合并数据后的结......
  • 【MySQL】多表查询:内连接VS外连接
    区别:内连接只取两张表中满足where条件的部分(交集部分),外连接除了取满足的部分还会取不满足的部分。因此外连接又可以分为:左外连接、右外连接、全外连接。1.内连接SQL92内......
  • 哈希类型,列表类型,集合类型,有序集合类型,慢查询,pipline与事务,发布订阅,Bitmap,HyperLogLog
    1API的使用1.1哈希类型###1---hget,hset,hdelhgetkeyfield#获取hashkey对应的field的value时间复杂度为o(1)hsetkeyfieldvalue#设置hashkey对应的field......
  • 加密后的数据如何进行模糊查询
    我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。为了数据安全我们在开发过程中经常会对重要的......
  • TairSearch:加速多列索引查询
    简介: 互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中。如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能。然而......
  • Java实现查询该节点所有下级数据
    摘要使用递归实现查询下级节点,直接上代码/***@Author:石银博*@Description:获取该节点所有下级部门(不包含该节点部门)*@DateTime:2022/8/1815......
  • 解析PHP中常见的mongodb查询操作_PHP教程
    //栏位字串为$querys=array("name"=>"shian");//数值等于多少$querys=array("number"=>7);//数值大于多少$querys=array("number"=>array('$gt'=>5));//数值大......
  • 开启慢查询
    一、什么是慢查询慢查询,顾名思义,执行很慢的查询。有多慢?超过long_query_time参数设定的时间阈值(默认10s),就被认为是慢的,是需要优化的。慢查询被记录在慢查询日志里。慢查询......
  • 查询日期用会计期间比制单日期取年月快
    selectga.iperiodas月,ga.iyearas年,(selectcasewhendep.cDepCodeisnullthendep1.cDepCodeelsedep.cDepCodeend)as部门编码,(selectcasewhendep.cDepNa......