共通テーブル式 (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を示すことができます。cte_query: 必須です。
SELECT
ステートメント。SELECT
ステートメントの結果セットは、指定されたCTEに入力されます。
例:
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
の両側にある2つのJOIN
句は、左のテーブルと同じサブクエリ文の出力を使用します。 したがって、サブクエリステートメントはコード内で繰り返されます。
ステートメントの繰り返しを防ぐために、CTEを使用できます。 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
に対応するサブクエリは1回だけ記述され、その後CTEとして再利用されます。 同じWITH
句で複数のサブクエリをCTEとして指定できます。 この方法では、変数を使用するのと同じ方法で、ステートメントで繰り返し使用できます。 CTEはまた、サブクエリを繰り返しネストする必要性を排除する。