HIVESQL中NOT EXISIS子查询多字段匹配有NULL值产生的问题记录(个人问题记录)

以上为测试数据,两张临时表的数据完全一致,来源于同一张表的两个分区中

需要在20230206的分区中判断数据是否与20230205一致,若一致,则不显示行

通过以下查询语句进行查询后,结果20230206的数据仍然会照常显示出来

with table1 as
(select
a.name ,   -- 名称
a.code ,   -- 编码
a.login_id ,   -- 帐号
a.email ,   --  邮箱
a.is_on_job ,   -- 是否在岗、在职标示
a.mobile ,   -- 移动电话
b.post_name,    --岗位名称
b.post_record_id,  --岗位记录
b.empl_rcd,
b.effdt,
b.effseq 
from ods_emp_i_d a
left join ods_emp_post_i_d b
on b.dt = '2023-02-05' and b.is_deleted=0 and b.flag = 1 and b.emp_code = a.code
where a.dt = '2023-02-05' and a.is_deleted=0 and a.code = '123456'
order by a.code,b.updated_time desc)
,
table2 as(
select
a.name ,   -- 名称
a.code ,   -- 编码
a.login_id ,   -- 帐号
a.email ,   --  邮箱
a.is_on_job ,   -- 是否在岗、在职标示--
a.mobile ,   -- 移动电话
b.post_name,    --岗位名称
b.post_record_id,  --岗位记录
b.empl_rcd,
b.effdt,
b.effseq 
from ods_emp_i_d a
left join ods_emp_post_i_d b
on b.dt = '2023-02-06' and b.is_deleted=0 and b.flag = 1 and b.emp_code = a.code
where a.dt = '2023-02-06' and a.is_deleted=0 and a.code = '123456'
order by a.code,b.updated_time desc)

select * from table2 t
where NOT exists(select 1 from table1 c 
                where nvl(c.code,'') = nvl(t.code,'')
                  and nvl(c.post_record_id,'') = nvl(t.post_record_id,'')
                  and nvl(c.empl_rcd,'') = nvl(t.empl_rcd,'')
                  and nvl(c.effdt,'') = nvl(t.effdt,'')
                  and nvl(c.effseq,'') = nvl(t.effseq,'')
                  )

解决方案:取消使用NOT EXISTS来过滤数据

修改为左连接的方式,只取20230206的数据

参考来源于https://blog.csdn.net/qq_38238956/article/details/124778421

成功解决。

请问下有没有大神指导一下,为什么通过not exists,将字段为空的数据用NVL转掉后,仍然无法正常过滤数据

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值