Иллюстрированный самоучитель по SQL для начинающих

Использование вложенных запросов

Другие коррелированные подзапросы

Как уже говорилось в предыдущем разделе, подзапросы с ключевым словом IN или оператором сравнения не обязательно должны быть коррелированными, хотя, с другой стороны, такой вариант вполне возможен.

Коррелированные подзапросы, перед которыми стоит ключевое слово IN

Выше, в разделе "Подзапросы, перед которыми стоит ключевое слово IN", рассказывалось, каким образом некоррелированный подзапрос можно использовать вместе с предикатом IN. А чтобы увидеть, каким образом этот предикат может использоваться, наоборот, коррелированным подзапросом, задайте тот же самый вопрос, что и в случае с предикатом EXISTS. Итак, какие фамилии и телефонные номера у представителей для контакта во всех организациях-покупателях продукции Zetec в Калифорнии? Ответ можно получить с помощью коррелированного подзапроса с IN:

SELECT *
FROM CONTACT
WHERE 'CA' IN
(SELECT CustState
FROM CUSTOMER
WHERE CONTACT.CustID = CUSTOMER.CustID);

Оператор выполняется с каждой записью таблицы CONTACT. Если значение столбца CustID этой записи совпадает с соответствующим значением столбца таблицы CUSTOMER, то значение CUSTOMER.CustState сравнивается со значением 'СА. Результатом выполнения подзапроса является список, в котором содержится не более одного элемента. Ваш этот единственный элемент представляет собой 'СА', то выполняется условие предложения WHERE из замыкающего оператора и строка добавляется в выводимую запросом таблицу.

Коррелированные подзапросы, перед которыми стоят операторы сравнения

Как будет показано в следующем примере, перед коррелированным подзапросом может стоять также любой из шести операторов сравнения.

Компания Zetec выплачивает каждому своему продавцу премию, которая зависит от общей суммы, вырученной им от продаж за месяц. Чем выше эта сумма, тем выше процент премии. Список этих процентов хранится в таблице BONUSRATE (ставка премии) со столбцами MIN_AMOUNT (нижняя граница), МАХ_AMOUNT (верхняя граница) (процент премии).

MIN_AMOUNT MAX_AMOUNT BONUS_PCT
---------------- ---------------- --------------
0.00 24999.99 0
25000.00 49999.99 0.001
50000.00 99999.99 0.002
100000.00 249999.99 0.003
250000.00 499999.99 0.004
500000.00 749999.99 0.005
750000.00 999999.99 0.006

Если у продавца ежемесячная сумма продаж составляет 100000-249999.99 долл., то он получает премию в размере 0.3% от этой суммы.

Продажи записываются в главную таблицу сделок TRANSMASTER.

TRANSMASTER
-----------------
Столбец Тип Ограничения
--------- ---- ----------------
TRANSID (идентификатор сделки) INTEGER PRIMARY KEY
CUSTID (идентификатор покупателя) INTEGER FOREIGN KEY
EMPID (идентификатор сотрудника) INTEGER FOREIGN KEY
TRANSDATE (дата сделки) DATE  
NET_AMOUNT (облагаемая налогом сумма) NUMERIC  
FREIGHT (стоимость перевозки) NUMERIC  
TAX (налог) NUMERIC  
INVOICETOTAL (итоговая сумма счета-фактуры) NUMERIC  
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.