【数据库】HIVE SQL中三种join中的坑(自动过滤掉两边同为null的数据)

    最近在使用union all的过程中,遇到了一些问题,又GET了一个知识点,作为一个总结,记录一下~

where条件的坑:

案例,若一个字段的值为1,2,NULL(自然空,而不是'NULL')这时,如果代码这样写:

select id,data,name 
  from aa
 where name <> 'us'

那么,为空的这一条记录是不会被筛选出来的。

iddatename
39148105112017-06-15hk
39148519662017-06-15hk

name为空的这一条就不会显示。

如果,这种情况就要通过转化才能达到想要的效果:

select *id,data,name 
  from a
 where coalesce(name,0) <> 'us'

结果:

iddatename
39121156252017-06-15NULL
39148105112017-06-15hk
39148519662017-06-15

hk

 

 

 

下面来讲一下full join,也会出现这样的问题,现在同一张表full join:

select a.id   as aid,
       a.date as adate,
       coalesce(a.name,b.name) as name,
       b.id   as bid,
       b.date as bdate
  from aa a
  full join aa b
    on a.name = b.name

结果为:

aidadatenamebidbdate
39121156252017-06-15NULLNULLNULL
NULLNULLNULL39121156252017-06-15
39148519662017-06-15hk39148519662017-06-15
39148519662017-06-15hk39148105112017-06-15
39148105112017-06-15hk39148519662017-06-15
39148105112017-06-15hk39148105112017-06-15
39204086382017-06-15us3920408638

2017-06-15

 

 

 

因此,也要做相应的处理才可以:

select a.id   as aid,
       a.date as adate,
       coalesce(a.name,b.name) as name,
       b.id   as bid,
       b.date as bdate
  from aa a
  full join aa b
    on coalesce(a.name,0) = coalesce(b.name,0)

结果为:

aidadatenamebidbdate
39121156252017-06-15NULL39121156252017-06-15
39148519662017-06-15hk39148519662017-06-15
39148519662017-06-15hk39148105112017-06-15
39148105112017-06-15hk39148519662017-06-15
39148105112017-06-15hk39148105112017-06-15
39204086382017-06-15us39204086382017-06-15

left join不会有这种问题,我也测试了一下:

select a.id   as aid,
       a.date as adate,
       coalesce(a.name,b.name) as name,
       b.id   as bid,
       b.date as bdate
  from aa a
  left join aa b
    on a.name = b.name

结果为:

aidadatenamebidbdate
39121156252017-06-15NULLNULLNULL
39148105112017-06-15hk39148519662017-06-15
39148105112017-06-15hk39148105112017-06-15
39148519662017-06-15hk39148519662017-06-15
39148519662017-06-15hk39148105112017-06-15
39204086382017-06-15us3920408638

2017-06-15

 

 

 

那么join呢,我也测试了一下:

select a.id   as aid,
       a.date as adate,
       coalesce(a.name,b.name) as name,
       b.id   as bid,
       b.date as bdate
  from aa a
  join aa b
    on a.name = b.name

结果为:

aidadatenamebidbdate
39148105112017-06-15hk39148519662017-06-15
39148105112017-06-15hk39148105112017-06-15
39148519662017-06-15hk39148519662017-06-15
39148519662017-06-15hk39148105112017-06-15
39204086382017-06-15us39204086382017-06-15

 

也有这样的问题,为null的结果不展示。

select a.id   as aid,
       a.date as adate,
       coalesce(a.name,b.name) as name,
       b.id   as bid,
       b.date as bdate
  from aa a
  join aa b
    on coalesce(a.name,0) = coalesce(b.name,0)
aidadatenamebidbdate
39121156252017-06-15NULL39121156252017-06-15
39148105112017-06-15hk39148519662017-06-15
39148105112017-06-15hk39148105112017-06-15
39148519662017-06-15hk39148519662017-06-15
39148519662017-06-15hk39148105112017-06-15
39204086382017-06-15us3920408638

2017-06-15

 

 

 

这次探讨的问题就到这里啦,如果还有别的部分,我后续会在更新~

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值