SQL 文の信頼性と実行効率を高めるため、MaxCompute は、標準 SQL の CTE に対応しています。
CTE の構文構造は、次のとおりです。
WITH
cte_name AS
cte_query
[,cte_name2 AS
cte_query2
,……]
- cte_name CTE 名を示します。WITH 句内で一意でなくてはいけません。 クエリ内の任意の位置にあっても、cte_name の識別子によって CTE であることが示されます。
- cte_query は 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 の左側のテーブルにも同じクエリが形成されます。 サブクエリを記述する場合は、このコードを繰り返す必要があります。
上記 SQL 文は、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 句によって複数のサブクエリを指定でき、文全体で変数のように繰り返し使用できます。 再利用できるだけでなく、サブクエリは繰り返しネストする必要はありません。