Wspólne Wyrażenie Tabeli (CTE - Common Table Expression) to tymczasowy nazwany zestaw wyników, do którego możesz się odwoływać wewnątrz instrukcji SELECT, INSERT, UPDATE lub DELETE. CTE może być także używane w widoku.

WITH cte_query AS
(SELECT … podzapytanie ...)
SELECT główne zapytanie ... FROM/JOIN z cte_query ...

Rodzaje: Rekurencyjne i Nierekurencyjne

Nierekurencyjne CTE

Istnieją dwa rodzaje CTE: rekurencyjne i nierekurencyjne.

Nierekurencyjne są proste, gdzie CTE jest używane do unikania duplikacji w SQL poprzez odwołanie się do nazwy zamiast samego zapytania SQL.

Przykład:

WITH avg_per_store AS
  (SELECT store, AVG(amount) AS average_order
   FROM orders
   GROUP BY store)
SELECT o.id, o.store, o.amount, avg.average_order AS avg_for_store
FROM orders o
JOIN avg_per_store avg
ON o.store = avg.store;

Rekurencyjne CTE

Rekurencyjne CTE korzystają z powtarzających się pętli proceduralnych, stąd rekursja. Zapytanie rekurencyjne wywołuje siebie, dopóki zapytanie nie spełni warunku. W rekurencyjnym CTE należy podać warunek, który zakończy rekursję.

Rekurencyjne CTE są przydatne do zapytań dotyczących danych hierarchicznych, takich jak struktury organizacyjne, gdzie jeden pracownik podlega kierownikowi, lub wielopoziomowe listy materiałów, gdzie produkt składa się z wielu komponentów, a każdy komponent również składa się z wielu innych komponentów.

WITH levels AS (
  SELECT
    id,
    first_name,
    last_name,
    superior_id,
    1 AS level
  FROM employees
  WHERE superior_id IS NULL
  UNION ALL
  SELECT
    employees.id,
    employees.first_name,
    employees.last_name,
    employees.superior_id,
    levels.level + 1
  FROM employees, levels
  WHERE employees.superior_id = levels.id
)
 
SELECT *
FROM levels;

Więcej informacji na temat 5 praktycznych przykładów użycia CTE w SQL | LearnSQL.com.