Вложенный подзапрос с оператором сравнения, отличным от IN

Выдать номера поставщиков, находящихся в том же городе, что и поставщик с номером 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”.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: