Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Otveti_po_liksiam.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
458.04 Кб
Скачать

With обобщенное_табличное_выражение (Transact-sql)

SQL Server 2012

Задается временно именованный результирующий набор, называемый обобщенным табличным выражением (ОТВ). Он извлекается при выполнении простого запроса и определяется в области выполнения одиночной инструкции SELECT, INSERT, UPDATE или DELETE. Это предложение может использоваться также в инструкции CREATE VIEW как часть определяющей ее инструкции SELECT. Обобщенное табличное выражение может включать ссылки на само себя. Такое выражение называется рекурсивным обобщенным табличным выражением.

 Синтаксические обозначения в Transact-SQL

Синтаксис

[ WITH <common_table_expression> [ ,...n ] ]

<common_table_expression>::=

    expression_name [ ( column_name [ ,...n ] ) ]

    AS

    ( CTE_query_definition )

Аргументы

expression_name

Действительный идентификатор обобщенного табличного выражения. Имя аргумента expression_name должно отличаться от имени другого обобщенного табличного выражения, определенного в том же предложении WITH <общее_табличное_выражение>, но expression_name может совпадать с именем базовой таблицы или представления. Любая ссылка на аргумент expression_name в запросе использует обобщенное табличное выражение, но не базовый объект.

column_name

Задается имя столбца в обобщенном табличном выражении. Повторяющиеся имена в определении одного CTE-выражения не допускаются. Количество заданных имен столбцов должно совпадать с количеством столбцов в результирующем наборе CTE_query_definition. Список имен столбцов необязателен только в том случае, если всем результирующим столбцам в определении запроса присвоены уникальные имена.

CTE_query_definition

Задается инструкция SELECT, результирующий набор которой заполняет обобщенное табличное выражение. Инструкция SELECT для CTE_query_definitionдолжна удовлетворять таким же требованиям, что и при создании представления, за исключением того, что CTE-выражение не может определять другое CTE-выражение. Дополнительные сведения см. в разделах «Примечания» и CREATE VIEW (Transact-SQL).

Если определено несколько параметров CTE_query_definition, определения запроса должны быть соединены одним из следующих операторов работы с наборами: UNION ALL, UNION, EXCEPT или INTERSECT.

Замечания

Рекомендации по созданию и использованию обобщенных табличных выражений

Следующие рекомендации относятся к нерекурсивным обобщенным табличным выражениям. Рекомендации, применимые к рекурсивным обобщенным табличным выражениям, см. в расположенном ниже разделе «Рекомендации по определению и использованию рекурсивных обобщенных табличных выражений».

  • За CTE должны следовать одиночные инструкции SELECT, INSERT, UPDATE или DELETE, ссылающиеся на некоторые или на все столбцы CTE. CTE может задаваться также в инструкции CREATE VIEW как часть определяющей инструкции SELECT представления.

  • Несколько определений запросов CTE-выражений могут быть определены в нерекурсивных CTE-выражениях. Определения могут объединяться одним из следующих операторов работы с наборами: UNION ALL, UNION, INTERSECT или EXCEPT.

  • CTE-выражения могут иметь ссылки сами на себя, а также на CTE-выражения, определенные до этого в том же предложении WITH. Ссылки на определяемые далее CTE-выражения недопустимы.

  • Задание в одном CTE-выражении нескольких предложений WITH недопустимо. Например, если CTE_query_definition содержит вложенный запрос, этот вложенный запрос не может содержать вложенное предложение WITH, определяющее другое CTE-выражение.

  • Следующие предложения не могут использоваться в CTE_query_definition:

    • ORDER BY (за исключением случаев задания предложения TOP)

    • INTO

    • Предложение OPTION с указаниями запросов

    • FOR XML

    • FOR BROWSE

  • Если CTE-выражение используется в инструкции, являющейся частью пакета, за инструкцией, стоящей перед ней, должен следовать символ точки с запятой.

  • Запрос, ссылающийся на CTE-выражение, может использоваться для определения курсора.

  • В CTE-выражении могут быть ссылки на таблицы, находящиеся на удаленных серверах.

  • При выполнении CTE-выражения между указаниями, ссылающимися на CTE-выражение, может быть конфликт с другими указаниями, обнаруживаемыми, когда CTE-выражения обращаются к их базовым таблицам так же, как указания обращаются к представлениям в запросах. Когда это происходит, запрос возвращает ошибку.

Просуков

Обобщенные табличные выражения (ОТВ)

Обобщенные табличные выражения (ОТВ) можно представить себе как временные результирующие наборы, определенные в области выполнения единичных инструкций SELECT, INSERT, UPDATE, DELETE или CREATE VIEW. ОТВ, как и производные таблицы, не сохраняются в базе данных в виде объектов, время их жизни ограничено продолжительностью запроса. Но, в отличие от производных таблиц, ОТВ могут ссылаться сами на себя, а на них один и тот же запрос может ссылаться несколько раз.

В основном ОТВ предназначены для:

  • Создания рекурсивных запросов.

  • Замены представлений в тех случаях, когда нет необходимости сохранять в метаданных базы его определение.

  • Многократных ссылок на результирующую таблицу из одной и той же инструкции.

ОТВ могут быть определены в пользовательских подпрограммах (функциях, хранимых процедурах, триггерах, представлениях).

Базовый синтаксиса ОТВ:

WITH имя_ОТВ [ ( список_имен_столбцов ) ]

AS

( определение_ОТВ )

Список имен столбцов необязателен только в том случае, если всем результирующим столбцам в определении запроса присвоены уникальные имена.

В простейшем случае инструкция для обращения к ОТВ имеет вид:

SELECT {*|список_имен_столбцов} FROM имя_ОТВ ;

Пример. Отобразить среднее количество поставок для поставщиков в учебной базе данных SPJ

WITH CTE (SupplierNo, NumberOfShips)

AS

(

SELECT Sno, COUNT(*) AS Total

FROM SPJ

WHERE Sno IS NOT NULL

GROUP BY Sno

)

SELECT AVG(NumberOfShips) AS "Среднее количество поставок для поставщиков"

FROM CTE;

GO

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]