Co jsou běžné tabulkové výrazy (CTE)?
Common Table Expression (CTE) je výsledná sada dotazu, která existuje dočasně a pro použití pouze v kontextu většího dotazu. Podobně jako odvozená tabulka se výsledek CTE neukládá a existuje pouze po dobu trvání dotazu. Tento článek se zaměří na nerekurzivní CTE.
Jak jsou CTE užitečné?
CTE, stejně jako databázové pohledy a odvozené tabulky, umožňují uživatelům snadněji psát a udržovat složité dotazy díky vyšší čitelnosti a zjednodušení. Tohoto snížení složitosti je dosaženo dekonstruováním běžně složitých dotazů do jednoduchých bloků, které se použijí a v případě potřeby znovu použijí při přepisování dotazu. Příklady případů použití zahrnují:
- Potřeba odkazovat na odvozenou tabulku vícekrát v jednom dotazu
- Alternativa k vytvoření pohledu v databázi
- Provedení stejného výpočtu vícekrát v rámci více komponent dotazu
Jak vytvořit CTE
- Spusťte CTE pomocí „WITH“
- Zadejte název dotazu, který bude brzy definován
- Po přiřazení názvu následujte „AS“
- Uveďte názvy sloupců (volitelný krok)
- Definujte dotaz, abyste získali požadovanou sadu výsledků
- Pokud je vyžadováno více CTE, začněte každý následující výraz čárkou a opakujte kroky 2–4.
- Odkaz na výše definované CTE v následném dotazu
Syntaxe
WITH
expression_name_1 AS
(CTE query definition 1)
[, expression_name_X AS
(CTE query definition X)
, etc ]
SELECT expression_A, expression_B, ...
FROM expression_name_1
##Příklad CTENásledující dotaz odpovídá na obchodní otázku:„Jaké jsou průměrné měsíční náklady na kampaň pro marketingové úsilí společnosti?“ Toho lze dosáhnout pomocí odvozeného dotazu (viz níže); nicméně použití CTE zlepšuje čitelnost
-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)
-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign
Použití odvozeného dotazu:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
-- this is where the derived query is used
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign
Dokumentace
- Postgres
- Červený posuv
- Oracle
- SQLServer