Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Коррелированный подзапрос в разделе HAVING

Читайте также:
  1. V. ПРИМЕРНАЯ ТЕМАТИКА КОНТРОЛЬНЫХ РАБОТ ПО ТЕОРИИ РАЗДЕЛЕНИЯ ВЛАСТЕЙ
  2. Билет 68. «Основное разделение права» на частное и публичное в континентальном праве: исторические основания, современное значение.
  3. В (наименование подразделения)_________________________________________
  4. В этом разделе находится описание ноутбука: модель XPS M1330, версия BIOS’a, сервисный код
  5. Виды производственной деятельности, их влияние на формирование затрат и результатов деятельности структурных подразделений и предприятия.
  6. ВРЕМЯ ОБНАРУЖЕНИЯ. ВРЕМЯ СООБЩЕНИЯ. ВРЕМЯ ПРИБЫТИЯ 1-го ПОЖАРНОГО ПОДРАЗДЕЛЕНИЯ. ВРЕМЯ ЛОКАЛИЗАЦИИ. ВРЕМЯ ЛИКВИДАЦИИ, ДАТА ЛИКВИДАЦИИ
  7. Все ли организации имеют вертикальное разделение труда?

Допустим, в целях увеличения своего дохода ваша организация решила в течение года проводить акцию по стимуляции потребительского спроса. Для этого покупатели извещаются о том, что если каждый сделанный ими в течение года заказ будет превышать сумму 750$, то в конце года на каждый их заказ вы сделаете скидку в 75$. Ниже приведен пример вычисления размера скидки. В этом примере для определения подпадающих под условие получения скидки покупателей, используется коррелированный подзапрос, помещённый в раздел HAVING.

select C.CustomerID, Count(*)*75 Rebate from Northwind.DBO.Customers C join Northwind.DBO.Orders O on c.CustomerID = O.CustomerID where Datepart(yy,OrderDate) = '1998' group by C.CustomerId having 750 < ALL(select sum(UnitPrice * Quantity * (1-Discount)) from Northwind.DBO.Orders O join Northwind.DBO.[Order Details] OD on O.OrderID = OD.OrderID where CustomerID = C.CustomerId and Datepart(yy,OrderDate) = '1998' group by O.OrderId )

Как Вы можете заметить, имеющийся в разделе HAVING коррелированный запрос используется для того, чтобы вычислить сумму заказа для каждого заказа клиента. Из внешнего запроса выбираются "CustomerID" и "Datepart (yy, OrderDate)" - год, когда был сделан заказ - которые нужны для того, что бы отобрать те заказы клиента, которые были сделаны в 1998 году. Для отобранных таким образом записей вычисляется сумма покупки по каждому заказу, для чего суммируются все записи "[Order Details]" по такой формуле: sum(UnitPrice * Quantity * (1-Discount)). Если каждая сделанная в 1998 покупка клиента превышает в сумме 750$, тогда во внешнем запросе вычисляется размер скидки по формуле: "Count (*) * 75".
Процессор запросов SQL Server выполнит помещённый в разделе HAVING внутренний коррелированный подзапрос для всех отобранных внешним запросом покупателей, которые делали заказы в 1998 году.

Применение коррелированного подзапроса в оператора Update

Коррелированный подзапрос также может использоваться и в операторе Update:

create table A(A int, S int) create table B(A int, B int) set nocount on insert into A(A) values(1) insert into A(A) values(2) insert into A(A) values(3) insert into B values(1,1) insert into B values(2,1) insert into B values(2,1) insert into B values(3,1) insert into B values(3,1) insert into B values(3,1) update A set S = (select sum(B) from B where A.A = A group by A) select * from A drop table A,B

В результате мы получим:

A S ----------- ----------- 1 1 2 2 3 3

В приведенном выше запросе коррелированный подзапрос используется для замены значений в столбце S таблицы А на сумму столбца B таблицы B, для тех строк, которые имеют одинаковые значения столбцов А, как в используемых для суммирования, так и в обновляемых строках.

Заключение

Давайте теперь подведём небольшой итог в этой статье. Подзапрос и коррелированный подзапрос - это операторы SELECT, используемые в другом запросе, называемом внешним. Коррелированный подзапрос и простой подзапрос очень полезны в оформлении выборки данных. Подзапрос, когда он выполняется независимо от внешнего запроса, возвращает выборку, которая также будет независимой от внешнего запроса. В свою очередь, коррелированный подзапрос не может исполняться независимо от внешнего запроса, потому что он ссылается на один или несколько столбцов внешнего запроса. Надеюсь, что теперь вы понимаете разницу между обычным и коррелированным подзапросом, и как их можно применять в T-SQL.

Подзапросы.

Говоря нестрого, подзапрос представляет собой выражение SELECT-FROM-WHERE, которое вложено в другое такое предложение. (Подзапрос может включать также фразу GROUP BY. Однако комбинация ORDER BY и UNION недопустима.) Обычно подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN, как иллюстрируется в следующем примере.


Дата добавления: 2015-12-08; просмотров: 80 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.005 сек.)