logo

CTE в SQL

The Загальні табличні вирази (CTE) були введені в стандартний SQL, щоб спростити різні класи запитів SQL, для яких похідна таблиця була просто непридатною. CTE було представлено в SQL Server 2005, вираз загальної таблиці (CTE) – це тимчасовий іменований набір результатів, на який можна посилатися в ВИБРАТИ , ВСТАВИТИ , ОНОВЛЕННЯ , або ВИДАЛИТИ заява. Ви також можете використовувати CTE у поданні CREATE як частину запиту SELECT подання. Крім того, починаючи з SQL Server 2008, ви можете додати CTE до нового оператора MERGE.

Навіщо нам CTE на сервері SQL?

Загальна таблиця [застаріло] CTE є потужною SQL конструкція, яка допомагає спростити запити. CTE діють як віртуальні таблиці (із записами та стовпцями), які створюються під час виконання запиту, використовуються в запиті та видаляються після виконання запиту.

Використання КТР

Ми можемо визначити CTE, додавши речення WITH безпосередньо перед оператором SELECT, INSERT, UPDATE, DELETE або MERGE. Речення WITH може містити один або кілька CTE, розділених комами.



javafx

Синтаксис:

[З [, …]]

::=

cte_name [(column_name [, …])]

AS (cte_query)

Аргумент

  1. Назва виразу: Дійсний ідентифікатор для виразу загальної таблиці. Ім'я_виразу має відрізнятися від імен інших виразів загальної таблиці, визначених у тому самому реченні WITH, але ім'я_виразу може збігатися з назвою базової таблиці або подання. Усі посилання на ім’я_виразу в запиті використовують вираз загальної таблиці замість базового об’єкта.
  2. Назва стовпця: Визначає назву стовпця у виразі загальної таблиці. Дубльовані імена в одному визначенні CTE не допускаються. Кількість імен стовпців має збігатися з кількістю стовпців у наборі результатів CTE_query_definition. Список імен стовпців необов’язковий, лише якщо всі отримані стовпці у визначенні запиту мають різні імена.
  3. CTE_QueryDefinition: Визначає оператор SELECT, набір результатів якого задовольняє вираз загальної таблиці. Інструкція SELECT для CTE_query_defining має відповідати тим самим вимогам, що й створення представлення, за винятком того, що CTE не може визначати інший CTE. Щоб отримати додаткові відомості, перегляньте розділ «Примітки» та CREATE VIEW (Transact-SQL). Якщо визначено декілька параметрів CTE_query_settings, визначення запиту потрібно поєднати з одним із операторів набору UNION ALL, UNION, EXCEPT або INTERSECT.

Правила для визначення та використання рекурсивних загальних табличних виразів

Наступні вказівки застосовуються до визначення рекурсивних загальних табличних виразів:

  1. Визначення рекурсивного CTE має містити принаймні два визначення запиту CTE: прив’язний елемент і рекурсивний член. Ви можете визначити кілька прив’язок і рекурсивних елементів. Однак усі визначення запиту прив’язного елемента мають бути розміщені перед першим визначенням рекурсивного елемента. Усі визначення запитів CTE є елементами прив’язки, якщо вони не посилаються на сам CTE.
  2. Елементи прив’язки повинні поєднуватися з одним із таких операторів набору: UNION ALL, UNION, INTERSECT, EXCEPT. UNION ALL — це єдиний дійсний оператор набору між останнім елементом прив’язки та першим рекурсивним елементом під час об’єднання кількох рекурсивних елементів. Прив’язні та рекурсивні елементи повинні мати однакову кількість стовпців.
  3. Тип даних стовпців рекурсивного елемента має збігатися з типом даних відповідного стовпця елемента прив’язки.
  4. Наступні елементи не дозволені в її CTE_query_definition для рекурсивних елементів:
Please choose a different grouping PIVOT (For database compatibility level 110 and above.  See Breaking Changes to Database Engine Features in SQL Server 2016. Offal Scalar aggregation Up LEFT, RIGHT, OUTER JOIN (INNER JOIN is allowed) subquery A hint applied to recursive references to CTEs within a CTE_query_definition.>

Створення рекурсивного виразу загальної таблиці

Рекурсивний CTE – це той, який посилається на себе в цьому CTE. Рекурсивний CTE корисний під час роботи з ієрархічними даними, оскільки CTE продовжує виконуватися, доки запит не поверне всю ієрархію.

назва міста США

Типовим прикладом ієрархічних даних є таблиця, яка містить список співробітників. Для кожного співробітника таблиця містить посилання на керівника цієї особи. Це посилання саме по собі є ідентифікатором працівника в одній таблиці. Ви можете використовувати рекурсивний CTE для відображення ієрархії даних про співробітників.

Якщо CTE створено неправильно, він може увійти в нескінченний цикл. Щоб запобігти цьому, підказку MAXRECURSION можна додати в пункт OPTION основного оператора SELECT, INSERT, UPDATE, DELETE або MERGE.

Створюється таблиця:

CREATE TABLE Employees (  EmployeeID int NOT NULL PRIMARY KEY,  FirstName varchar(50) NOT NULL,  LastName varchar(50) NOT NULL,  ManagerID int NULL )  INSERT INTO Employees VALUES (1, 'Ken', 'Thompson', NULL) INSERT INTO Employees VALUES (2, 'Terri', 'Ryan', 1) INSERT INTO Employees VALUES (3, 'Robert', 'Durello', 1) INSERT INTO Employees VALUES (4, 'Rob', 'Bailey', 2) INSERT INTO Employees VALUES (5, 'Kent', 'Erickson', 2) INSERT INTO Employees VALUES (6, 'Bill', 'Goldberg', 3) INSERT INTO Employees VALUES (7, 'Ryan', 'Miller', 3) INSERT INTO Employees VALUES (8, 'Dane', 'Mark', 5) INSERT INTO Employees VALUES (9, 'Charles', 'Matthew', 6) INSERT INTO Employees VALUES (10, 'Michael', 'Jhonson', 6)>

Після створення таблиці Employees створюється такий оператор SELECT, якому передує речення WITH, що містить CTE під назвою cteReports:

WITH  cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)  AS  (  SELECT EmployeeID, FirstName, LastName, ManagerID, 1  FROM Employees  WHERE ManagerID IS NULL  UNION ALL  SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,   r.EmpLevel + 1  FROM Employees e  INNER JOIN cteReports r  ON e.ManagerID = r.EmpID  ) SELECT  FirstName + ' ' + LastName AS FullName,   EmpLevel,  (SELECT FirstName + ' ' + LastName FROM Employees   WHERE EmployeeID = cteReports.MgrID) AS Manager FROM cteReports  ORDER BY EmpLevel, MgrID>

Таким чином, CTE можуть бути корисними, коли вам потрібно створити тимчасові набори результатів, доступ до яких можна отримати за допомогою операторів SELECT, INSERT, UPDATE, DELETE або MERGE.

тернарний оператор java

Функції та обмеження загальних табличних виразів у Azure

Поточна реалізація CTE в Azure Synapse Analytics і Analytics Platform System (PDW) має такі функції та обмеження:

  1. CTE можна вказати лише в операторі SELECT.
  2. CTE можна вказати лише в операторі CREATE VIEW.
  3. CTE можна вказати лише в операторі CREATE TABLE AS SELECT (CTAS).
  4. CTE можна вказати лише в операторі CREATE REMOTE TABLE AS SELECT (CRTAS).
  5. CTE можна вказати лише в операторі CREATE EXTERNAL TABLE AS SELECT (CETAS).