Общие табличные выражения
Общие табличные выражения (Common Table Expressions, CTE) позволяют определять временные именованный набор данных, функционально похожий на представление (View), доступный в пределах пакета (batch).
Для упрощения дальнейшего изложения, введем более простой термин виртуальное представление вместо дословного английского перевода общее табличное выражение.
Виртуальные представления позволяют использовать однажды объявленное в процедуре представление вместо вложенных запросов, как это приходилось делать в более ранних версиях SQL Server, что значительно улучшает читаемость T-SQL кода. Для объявления представление используется синтаксис WITH ИмяПредставления(ИмяПоля, ИмяПоля, …) AS (Подзапрос)
где число полей в объявлении представления должно соответствовать числу получаемых полей в подзапросе.
Допустим, необходимо осуществить выборку всех моделей, цена которых превосходит среднюю цену в модельном ряду своего производителя.
Задачу можно решить, используя виртуальное представление WITH AvgPrice(BrandID, Price) AS
(SELECT BrandID, AVG(Price) FROM Products GROUP BY BrandID)
SELECT P.Model FROM Products AS P INNER JOIN AvgPrice AS A ON
P.BrandID = A.BrandID AND P.Price > A.Price
или используя вложенный подзапрос SELECT P.Model FROM Products AS P INNER JOIN (SELECT BrandID, AVG(Price) FROM Products GROUP BY BrandID) AS A ON
P.BrandID = A.BrandID AND P.Price > A.Price
Как видно из примера, использование CTE и вложенных подзапросов эквивалентно, но, читатель легко может представить ситуацию, когда одно и то же виртуальное представление данных нужно использовать несколько раз в хранимой процедуре, в этом случае единожды объявленное представление с использованием CTE потребует значительно меньше SQL кода.