Co to są wspólne wyrażenia tabelowe (CTE)?
Common Table Expression (CTE) to zestaw wyników zapytania, który istnieje tymczasowo i jest używany tylko w kontekście większego zapytania. Podobnie jak tabela pochodna, wynik CTE nie jest przechowywany i istnieje tylko przez czas trwania zapytania. W tym artykule skupimy się na nierekurencyjnych CTE.
Jak przydatne są CTE?
CTE, takie jak widoki bazy danych i tabele pochodne, umożliwiają użytkownikom łatwiejsze pisanie i obsługę złożonych zapytań dzięki zwiększonej czytelności i uproszczeniu. Ta redukcja złożoności jest osiągana przez dekonstrukcję zwykle złożonych zapytań na proste bloki, które mają być użyte i ponownie użyte, jeśli to konieczne, przy przepisaniu zapytania. Przykładowe przypadki użycia to:
- Konieczność wielokrotnego odwoływania się do tabeli pochodnej w jednym zapytaniu
- Alternatywa dla tworzenia widoku w bazie danych
- Wykonywanie tych samych obliczeń wielokrotnie w wielu składnikach zapytania
Jak utworzyć CTE
- Zainicjuj CTE za pomocą „Z”
- Podaj nazwę zapytania, które wkrótce ma zostać zdefiniowane
- Po przypisaniu nazwy wykonaj „AS”
- Określ nazwy kolumn (krok opcjonalny)
- Zdefiniuj zapytanie, aby uzyskać pożądany zestaw wyników
- Jeśli wymaganych jest wiele CTE, każde kolejne wyrażenie zainicjuj przecinkiem i powtórz kroki 2-4.
- Odwołaj się do wyżej zdefiniowanych CTE w kolejnym zapytaniu
Składnia
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
##Przykład CTENastępujące zapytanie odpowiada na pytanie biznesowe:„jaki jest średni miesięczny koszt kampanii dla działań marketingowych firmy?” Można to osiągnąć za pomocą zapytania pochodnego (pokazanego poniżej); jednak użycie CTE poprawia czytelność
-- 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
Za pomocą zapytania pochodnego:
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
Dokumentacja
- Postgres
- Przesunięcie ku czerwieni
- Wyrocznia
- SQLSerwer