Hive With as 用法

该博客展示了如何在Hive SQL中使用WITH AS子查询来拆分复杂查询,提高代码的可读性和效率。通过两个示例查询,博主解释了如何将原始查询分解为临时表,并最终进行左连接操作以获取学生分数及其对应科目名称。优化后的查询虽然执行时间稍长,但逻辑更清晰。
摘要由CSDN通过智能技术生成
hive> select  t.id
    >         ,t.name
    >         ,t.clazz
    >         ,t.score_id
    >         ,t.score
    >         ,c.subject_name
    > from(
    >     select  a.id
    >         ,a.name
    >         ,a.clazz
    >         ,b.score_id
    >         ,b.score
    >     from (
    >         select  id
    >                 ,name
    >                 ,clazz
    >         from
    >         students
    >     ) a left join (
    >     select  id
    >             ,score_id
    >             ,score
    >     from score
    >     ) b
    >     on a.id = b.id
    > ) t left join (
    >     select  subject_id
    >             ,subject_name 
    >     from subject
    > ) c on t.score_id = c.subject_id
    > limit 10;
OK
1500100001	施笑槐	文科六班	1000001	98	语文
1500100001	施笑槐	文科六班	1000002	5	数学
1500100001	施笑槐	文科六班	1000003	137	英语
1500100001	施笑槐	文科六班	1000004	29	政治
1500100001	施笑槐	文科六班	1000005	85	历史
1500100001	施笑槐	文科六班	1000006	52	物理
1500100002	吕金鹏	文科六班	1000001	139	语文
1500100002	吕金鹏	文科六班	1000002	102	数学
1500100002	吕金鹏	文科六班	1000003	44	英语
1500100002	吕金鹏	文科六班	1000004	18	政治
Time taken: 17.529 seconds, Fetched: 10 row(s)

// with as 可以把子查询拿出来,让代码逻辑更加清晰,提高效率
// 必须跟着sql一起使用

hive> with tmp1 as (
    >     select  id
    >             ,name
    >             ,clazz
    >     from students
    > ), tmp2 as ( 
    >     select  score_id
    >             ,id
    >             ,score
    >     from
    >     score
    > ), tmp1Jointmp2 as (
    >     select  a.id
    >             ,a.name
    >             ,a.clazz
    >             ,b.score_id
    >             ,b.score
    >     from tmp1 a
    >     left join tmp2 b
    >     on a.id = b.id
    > ), tmp3 as (
    > select   subject_id
    >         ,subject_name 
    > from subject
    > ) select  t.id
    >         ,t.name
    >         ,t.clazz
    >         ,t.score_id
    >         ,t.score
    >         ,c.subject_name
    > from tmp1Jointmp2 t left join tmp3 c
    > on t.score_id = c.subject_id
    > limit 10;
OK
1500100001	施笑槐	文科六班	1000001	98	语文
1500100001	施笑槐	文科六班	1000002	5	数学
1500100001	施笑槐	文科六班	1000003	137	英语
1500100001	施笑槐	文科六班	1000004	29	政治
1500100001	施笑槐	文科六班	1000005	85	历史
1500100001	施笑槐	文科六班	1000006	52	物理
1500100002	吕金鹏	文科六班	1000001	139	语文
1500100002	吕金鹏	文科六班	1000002	102	数学
1500100002	吕金鹏	文科六班	1000003	44	英语
1500100002	吕金鹏	文科六班	1000004	18	政治
Time taken: 19.74 seconds, Fetched: 10 row(s)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值