Реферат: Новые возможности T-SQL в MS SQL Server 2005
Общие табличные выражения
Общие табличные выражения (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 кода.
Рекурсия с использованием виртуальных представлений
Одним из основных преимуществ виртуальных представлений (CTE), является простое и наглядное построение рекурсивных выражений.
Достаточно часто встречаются таблицы с иерархической структурой данных («деревья»). В случае, когда необходимо получить уровень вложенности элемента, лучшим решением будет использование рекурсивного запроса с использованием виртуального представления. Допустим, в магазине, использующем демонстрационную базу данных, решили добавить возможность задавать «степень родства» фирм, для определения дочерних компаний известных брендов.
Для таблицы Brands нужно создать виртуальное представление, использующее рекурсию для получения уровня вложенности:
WITH C (BrandID, [Name], ParentID, NestingLevel) AS ( SELECT B.BrandID, B.[Name], B.ParentID, 1 FROM Brands AS B WHERE ParentID = 0 UNION ALL SELECT B.BrandID, B.[Name], B.ParentID, (NestingLevel + 1) FROM Brands AS B INNER JOIN C ON C.BrandID = B.ParentID ) SELECT * FROM C |
Результатом выполнения запроса будет таблица, например такая:
К-во Просмотров: 550
Бесплатно скачать Реферат: Новые возможности T-SQL в MS SQL Server 2005
|