MySQL8.0ではCommon Table Expression(CTE)(共通テーブル式)、つまりWITH句のサポートを開始しました。
簡単に始められます:
次の SQL は、再帰呼び出しに似た単純な CTE 式です。この SQL では、最初に select 1 を実行し、次にクエリ結果を取得し、値 n を送信して cte から n+1 を選択します (n <10、union all の下)。次にこのようにして、次の Union all の SQL ステートメントを再帰的に呼び出します。
WITH recursive cte(n) as
( select 1
union ALL
select n+1 from cte where n<10
)
select * from cte;
事例紹介:
スタッフ テーブルには、id、name、および対応する上位 ID である m_id が含まれます。データは次のとおりです。
各従業員の上司部下関係を知りたい場合は、次のような方法が考えられます。
再帰的 CTE:
with recursive staff_view(id,name,m_id) as
(select id ,name ,cast(id as char(200))
from staff where m_id =0
union ALL
select s2.id ,s2.name,concat(s1.m_id,'-',s2.id)
from staff_view as s1 join staff as s2
on s1.id = s2.m_id
)
select * from staff_view order by id
一般的なテーブル式を使用する利点は、上位レベルと下位レベルに 4、5、6、またはそれ以上のレイヤーがある場合でも、それらを横断するのに役立ち、SQL ステートメントの古い記述方法を調整する必要があることです。
要約:
共通テーブル式は、ステートメント レベルの一時テーブルやビューなどの派生テーブルに似ています。CTE はクエリ内で複数回参照したり、他の CTE を参照したり、再帰的に参照したりできます。CTE は、SELECT/INSERT/UPDATE/DELETE などのステートメントをサポートします。