Какви са общите таблични изрази (CTE)?
Общият табличен израз (CTE) е резултатният набор от заявка, която съществува временно и за използване само в контекста на по-голяма заявка. Подобно на получена таблица, резултатът от CTE не се съхранява и съществува само за времето на заявката. Тази статия ще се фокусира върху нерекурсивните CTE.
С какво са полезни CTE?
CTE, като изгледи на база данни и извлечени таблици, позволяват на потребителите по-лесно да пишат и поддържат сложни заявки чрез повишена четливост и опростяване. Това намаляване на сложността се постига чрез деконструиране на обикновено сложни заявки в прости блокове, които да се използват и да се използват повторно, ако е необходимо, при пренаписване на заявката. Примерните случаи на употреба включват:
- Необходимост от препращане към извлечена таблица няколко пъти в една заявка
- Алтернатива на създаването на изглед в базата данни
- Извършване на едно и също изчисление многократно в множество компоненти на заявката
Как да създадете CTE
- Започнете CTE, като използвате „WITH“
- Посочете име за заявката за резултат, която скоро ще бъде определена
- След като зададете име, следвайте „AS“
- Посочете имена на колони (стъпка по избор)
- Дефинирайте заявката, за да произведете желания набор от резултати
- Ако са необходими множество CTE, инициирайте всеки следващ израз със запетая и повторете стъпки 2-4.
- Препратете към дефинираните по-горе CTE в следваща заявка
Синтаксис
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
##Пример CTEСледната заявка отговаря на бизнес въпроса:„каква е средната месечна цена на кампания за маркетинговите усилия на компанията?“ Това може да се постигне с производна заявка (показана по-долу); обаче използването на CTE подобрява четливостта
-- 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
Използване на производна заявка:
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
Документация
- Postgres
- Червено изместване
- Oracle
- SQLServer