MySQL8.0 начал поддерживать общее табличное выражение (CTE) (общее табличное выражение), то есть предложение WITH.
Легко начать:
Следующий SQL представляет собой простое выражение CTE, похожее на рекурсивный вызов.В этом SQL сначала выполните select 1, а затем получите результат запроса и отправьте значение n для выбора n+1 в объединении всех из cte, где n <10, Затем рекурсивно вызовите следующий SQL-оператор объединения таким образом.
WITH recursive cte(n) as
( select 1
union ALL
select n+1 from cte where n<10
)
select * from cte;
Введение в дело:
Таблица персонала содержит id, name и m_id, который является соответствующим вышестоящим 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.