Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

FROM Sales.Customers




WHERE country = N'USA') AS USACusts;

 

Результат:

 

Определить табличное выражение любого типа можно в запросе, отвечающем трем требованиям.

1. Порядок следования строк должен быть произвольным. Предполагается, что табличное выражение представляет собой реляционную таблицу, а у строк реляционной таблицы определенного порядка следования нет. По этой причине стандарт ANSI SQL не разрешает применять элемент order BY в запросах, определяющих табличные выражения. Язык T-SQL соблюдает это ограничение в большинстве случаев за исключением элемента тор. В запросе с необязательным элементом тор синтаксический элемент ORDER BY служит логической цели: определяет для элемента тор, какие строки выбирать. Если в запросе с элементами тор и orDER BY задается табличное выражение, элемент order by гарантированно применяется только для логического упорядочивания, необходимого элементу тор, а не как обычно для представления данных. Если во внешнем запросе к табличному выражению нет элемента orDER BY для представления результата, определенный порядок его вывода не гарантирован.

2. У всех столбцов должны быть имена. Следовательно, необходимо присвоить псевдонимы столбцов всем выражениям в списке select запроса, применяемого для задания табличного выражения.

3. Все имена столбцов должны быть уникальны. Следовательно, табличное выражение с несколькими столбцами, имеющими одно и то же имя, не корректно. Подобное может произойти, если в запросе, определяющем табличное выражение, соединяются две таб­лицы, и в них обоих есть столбец с одним и тем же именем. Если нужно включить оба столбца в табличное выражение, у них должны быть разные имена столбцов. Эту проблему можно решить, присвоив двум столбцам разные псевдонимы столбцов.

 

Одно из преимуществ использования табличных выражений — возможность ссылаться в любом синтаксическом элементе внешнего запроса на псевдонимы столбцов, присвоенные в элементе select внутреннего запроса. Это помогает обойти ограничение, запрещающее ссылаться на присвоенные в элементе select псевдонимы столбцов в элементах запроса, которые логически обрабатываются до элемента select (таких как where или group by).

Предположим, что нужно написать запрос к таблице Sales.Orders (Заказы) и вернуть за все годы, указанные в датах заказов, количество разных клиентов, делавших заказы в течение каждого года.

Следующий пример запроса не корректен, т. к. элемент group by ссылается на псевдоним столбца, который был присвоен в элементе select, а синтаксический элемент GROUP BY логически обрабатывается до элемента select.

SELECT

YEAR(orderdate) AS orderyear,

COUNT(DISTINCT custid) AS numcusts

FROM Sales.Orders

GROUP BY orderyear;

 

Другая конструкция SELECT допустима, но используется две копии одного выражения (в этом случае выражение простое).

 

SELECT YEAR(orderdate) AS orderyear,

COUNT(DISTINCT custid) AS numcusts

FROM Sales.Orders

GROUP BY YEAR(orderdate);

 

Лучше применять табличное выражение:

SELECT orderyear, COUNT(DISTINCT custid) AS numcusts

FROM (SELECT YEAR(orderdate) AS orderyear, custid

FROM Sales.Orders) AS D

GROUP BY orderyear;

 

В данном программном кодеопределяется таблица D, получаемая из запроса к таблицеOrders (Заказы), который возвращает год заказа и идентификатор клиента из каждой строки.

В списке SELECT внутреннего запроса для присвоения в элементах group by и SELECT псевдонима столбца orderyear выражению YEAR(orderdate) используется формат внутреннего или встроенного назначения псевдонимов. Внешний запрос может ссылаться на псевдоним столбца в обоих синтаксических элементах, поскольку в своей области действия он обращается к таблице D, имеющей столбцы, названные orderyear и custid (id клиента).

Следует отметить, что SQL Server раскрывает определение табличного выражения и обращается непосредственно к его базовым объектам. Если раскрыть этот запрос, то он имеет вид

SELECT YEAR(orderdate) AS orderyear, COUNT(DISTINCT custid) AS numcusts

FROM Sales.Orders

GROUP BY YEAR(orderdate);

 

В программном коде рассмотренного раньше примера используется формат встраиваемого в элемент запроса назначения выражениям псевдонимов столбцов (псевдонимы внутри вложенного запроса).

 

Синтаксическая запись для встраиваемого назначения псевдонимов:

<выражение> [AS] <псевдоним>

Хотя в этой конструкции ключевое слово AS необязательно, но оно облегчает чтение программного кода.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...