Выдать номера поставщиков, находящихся в том же городе, что и поставщик с номером 6.
SELECT ПС ¦ Результат: ПС
FROM Поставщики ¦ --
WHERE Город = ¦ 1
(SELECT Город ¦ 4
FROM Поставщики ¦ 6
WHERE ПС = 6); ¦
В подобных запросах можно использовать и другие операторы сравнения (<>, <=, <, >= или >), однако, если вложенный подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка.
Коррелированные вложенные подзапросы
Выдать название и статус поставщиков продукта с номером 11.
SELECT Название, Статус
FROM Поставщики
WHERE 11 IN
(SELECT ПР
FROM Поставки
WHERE ПС = Поставщики.ПС);
Такой подзапрос отличается от рассмотренного в п. 3.3.2 тем, что вложенный подзапрос не может быть обработан прежде, чем будет обрабатываться внешний подзапрос. Это связано с тем, что вложенный подзапрос зависит от значения Поставщики.ПС а оно изменяется по мере того, как система проверяет различные строки таблицы Поставщики. Следовательно, с концептуальной точки зрения обработка осуществляется следующим образом:
|
|
1. Система проверяет первую строку таблицы Поставщики. Предположим, что эта строка поставщика с номером 1. Тогда значение Поставщики.ПС будет в данный момент имеет значение равное 1 и система обрабатывает внутренний запрос
(SELECT ПР
FROM Поставки
WHERE ПС = 1);
получая в результате множество (9, 11, 12, 15). Теперь система может завершить обработку для поставщика с номером 1. Выборка значений Название и Статус для ПС=1 (СЫТНЫЙ и рынок) будет произведена тогда и только тогда, когда ПР=11 принадлежит этому множеству, что, очевидно, справедливо.
2. Далее система будет повторять обработку такого рода для следующего поставщика и т.д. до тех пор, пока не будут рассмотрены все строки таблицы Поставщики.
.
Рассмотрим пример использования одной и той же таблицы во внешнем подзапросе и коррелированном вложенном подзапросе.
Выдать номера всех продуктов, поставляемых только одним поставщиком.
SELECT DISTINCT X.ПР ¦ Результат: X.ПР
FROM Поставки X ¦ ----
WHERE X.ПР NOT IN ¦ 17
(SELECT Y.ПР ¦
FROM Поставки Y ¦
WHERE Y.ПС <> X.ПС); ¦
Действие этого запроса можно пояснить следующим образом: “Поочередно для каждой строки таблицы Поставки, скажем X, выделить значение номера продукта (ПР), если и только если это значение не входит в некоторую строку, скажем Y, той же таблицы, а значение столбца номер поставщика (ПС) в строке Y не равно его значению в строке X”.