【数据库】HIVE SQL:用连接操作替代子查询

         由于HQL和SQL很像,很多功能也通用,所有,有些小伙伴直接把SQL的方法套用到HQL上,经常遇到各种报错。这次,小白又发现HQL不支持子查询操作,那么如何解决这种需求呢?

如下:想把最大年龄的人取出来  这里如下语句无论是用=或者是in都不支持

select * 
  from table
 where age =(in) (select max(age) from table)

在HQL中会报错。

这时可以先用子查询把符合条件的取出,在用left join 或join连接该表,得到想要的结果。

select b.* 
  from (select max(age) as age 
          from table
       ) a
  (left) join table b
    on a.age = b.age

结果为:

nameage
张三19

如果筛选出课程是17和18的人取出来:

select * 
  from table
 where age in (select kecheng from tableb
                where kecheng in (17,18))

如何替换呢?这时可以用到left semi join

select a.* 
  from table a
  left semi join tableb b
    on a.name = b.name
   and b.kecheng in (17,18)

结果:

namekecheng
李玉18
王五17
李四17

这里就不能直接用left jion,如果这样的语句直接用left jion那么结果会是怎么样呢?

select a.* 
  from table a
  left join tableb b
    on a.name = b.name
   and b.kecheng in (17,18)

结果为:

namekecheng
李玉18
王五17
李四17
张三19

如果想用left join这时要把条件放到where中才能达到同样的效果:

select a.* 
  from table a
  left join tableb b
    on a.name = b.name
 where b.kecheng in (17,18)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值