Database
 sql >> база данни >  >> RDS >> Database

Често срещани таблични изрази:кога и как да ги използвате

Какви са общите таблични изрази (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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да преименувате таблица в SQL

  2. Модел на данни за детско парти

  3. Хеш присъединява към нулеви колони

  4. Проблеми с представянето:Първата среща

  5. Грешки при свързване с база данни или удостоверяване с подвижен тип