Общие табличные выражения
Общие табличные выражения (ОТВ, Common table expression (CTE)) — другой тип табличных выражений, очень похожих на производные таблицы, но с важными дополнительнымипреимуществами. ОТВ были введены в SQL Server 2005 и являются частью стандарт языка ANSI SQL:1999 и более поздних версий стандартов. ОТВ определяются с помощью инструкции with и имеют следующий синтаксис:
WITH < ОТВ_Имя > [(< Список_столбцов_результата >)] AS ( < внутренний_запрос_задающий_ОТВ > ) < внешний_запрос_к_ОТВ >;
Внутренний запрос, задающий ОТВ, должен удовлетворять всем изложенным ранее требованиям для того, чтобы корректно определить табличное выражение. Примечание: Синтаксический элемент WITH в языке T-SQL применяется для разных целей. Для того, чтобы исключить неоднозначность, если элемент WITH используется для определения ОТВ, предыдущая инструкция в том же фрагменте, если таковая существует, должна заканчиваться точкой с запятой.
Пример: определяется ОТВ USACusts (Клиенты из США), основанное на запросе, который возвращает всех клиентов из Соединенных Штатов, а внешний запрос выбирает из ОТВ все строки. WITH USACusts AS ( SELECT custid, companyname FROM Sales.Customers WHERE country = N'USA' ) SELECT * FROM USACusts;
Результат:
ОТВ также поддерживают две формы назначения псевдонимов столбцов: встраиваемую и внешнюю.
Во встраиваемой форме используется конструкция <выражение> as <псевдоним_столбца> Пример встраиваемой формы: WITH C AS ( SELECT YEAR(orderdate) AS orderyear, custid FROM Sales.Orders ) SELECT orderyear, COUNT(DISTINCT custid) AS numcusts FROM C GROUP BY orderyear;
Во внешней форме используется список результирующих столбцов в круглых скобках, указываемых сразу после имени ОТВ. Пример внешней формы:
WITH C(orderyear, custid) AS ( SELECT YEAR(orderdate), custid FROM Sales.Orders ) SELECT orderyear, COUNT(DISTINCT custid) AS numcusts FROM C GROUP BY orderyear; GO
В запросе, используемом для определения ОТВ, можно задавать аргументы, как и в запросах с производными таблицами. Пример: WITH C AS ( SELECT YEAR(orderdate) AS orderyear, custid FROM Sales.Orders WHERE empid = @empid ) SELECT orderyear, COUNT(DISTINCT custid) AS numcusts FROM C GROUP BY orderyear; GO
Читайте также: I. ОБЩИЕ МЕТОДИЧЕСКИЕ УКАЗАНИЯ Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|