CTE表示公用表表達式,是一個臨時命名結果集,用于簡化SQL。MaxCompute支持標準SQL的CTE,可以更好地提高SQL語句的可讀性與執行效率。本文為您介紹CTE的功能、命令格式及使用示例。
功能介紹
CTE可以被認為是在單個DML語句的執行范圍內定義的臨時結果集。CTE類似于派生表,它不作為對象存儲,并且僅在查詢期間持續。開發過程中結合CTE,可以提高SQL語句可讀性,便于輕松維護復雜查詢。
命令格式
with
<cte_name> as
(
<cte_query>
)
[,<cte_name2> as
(
<cte_query2>
)
,……]
- cte_name:必填。CTE的名稱,不能與當前
with
子句中的其他CTE的名稱相同。查詢中任何使用到cte_name標識符的地方,均指CTE。 - cte_query:必填。一個
select
語句。select
的結果集用于填充CTE。
使用示例
假設現有如下代碼:
insert overwrite table srcp partition (p='abc')
select * from (
select a.key, b.value
from (
select * from src where key is not null ) a
join (
select * from src2 where value > 0 ) b
on a.key = b.key
) c
union all
select * from (
select a.key, b.value
from (
select * from src where key is not null ) a
left outer join (
select * from src3 where value > 0 ) b
on a.key = b.key and b.key is not null
)d;
頂層的union
兩側各為一個join
,join
的左表是相同的查詢語句。通過寫子查詢的方式,只能重復這段代碼。
使用CTE的方式重寫以上語句,命令示例如下:
with
a as (select * from src where key is not null),
b as (select * from src2 where value > 0),
c as (select * from src3 where value > 0),
d as (select a.key, b.value from a join b on a.key=b.key),
e as (select a.key,c.value from a left outer join c on a.key=c.key and c.key is not null)
insert overwrite table srcp partition (p='abc')
select * from d union all select * from e;
重寫后,a
對應的子查詢只需寫一次,便可在后面進行重用。您可以在CTE的with
子句中指定多個子查詢,像使用變量一樣在整個語句中反復重用。除重用外,不必反復嵌套。