Apache Hive With
(数据查询到内存)
Apache Hive With
⊙hive 可以通过with 查询来提高查询性能,
因为先通过with语法可以将数据查询到内存,
然后后面查询可以直接使用。
With案例
EG1:
with q1 as(select key from a2data.test where key = ‘666’)
select *
from
q1;
--from style
with q1 as (select * from a2data.test where key = '666')
from q1
select *;
-- chaining CTEs
with q1 as (select key from q2 where key = '666')
q2 as (select key from a2data.test where key ='666')
select * from (select key from q1) a;
-- union example
with q1 as (select * from a2data.test where key = '666'),
q2 as (select * from a2data.test s2 where key = '6')
select * from q1 union all select * from q2;
--insert example
create table tb1 like a2data.test;
with q1 as (select key, value from a2data.test where key = '666')
from q1
insert overwrite table tb1;
1) 使用with 子句 可以让子查询重用相同的 with 查询块,
通过select调用(with 子句只能被select 查询块引用),
一般情况,with 查询用到多次情况下,在引用select语句之前定义,同级只能定义with关键字只能使用一次,多个用逗号分割。
2)with 子句的返回结果存到用户的临时表空间中,只做一次查询,反复使用来提高效率。3)在同级select 前有多个查询定义的时候,个用with ,后面的不用with,并且用逗号(,)隔开。
4)后一个with 子句 与下面的查询之间不能有逗号, 只能通过右括号分割,
with子句的查询必须用括号括起来。
5)如果定义了with子句,而在查询中不使用,那么会报错:
ora-320035的错误,未引用with子句中定义的查询名。
(至少一个with查询的name 未被引用,解决方案是移除未被引用的with 查询),
注意: 只要后边有引用的就可以,不一定非要在住查询中引用,比如后边的with查询中引用了,也是可以的。
6)前面的with子句定义的查询在后面的with子句中可以使用。
但是一个with子句内部不能 嵌套with 子句。
7)当一个查询块名字和一个表名或其他的对象相同时,解析器从内向外搜索,优先使用子查询块名字。
8)with 查询的结果列有别名,引用的时候必须使用别名或*。