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 句によって複数のサブクエリを指定でき、文全体で変数のように繰り返し使用できます。 再利用できるだけでなく、サブクエリは繰り返しネストする必要はありません。