3.3.2. Простые вложенные подзапросы

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

| Результат:
--- | ---
    SELECT	Название, Статус
    FROM	Поставщики
    WHERE	ПС IN
    	(	SELECT	ПС
    		FROM	Поставки
    		WHERE	ПР = 11 );
Название | Статус
--- | ---
СЫТНЫЙ | рынок
УРОЖАЙ | коопторг
ЛЕТО | агрофирма
КОРЮШКА | кооператив

Как уже отмечалось в п.3.3.1, при обработке полного запроса система выполняет прежде всего вложенный подзапрос. Этот подзапрос выдает множество номеров поставщиков, которые поставляют продукт с кодом ПР = 11, а именно множество (1, 5, 6, 8). Поэтому первоначальный запрос эквивалентен такому простому запросу:

    SELECT	Название, Статус
    FROM	Поставщики
    WHERE	ПС IN (1, 5, 6, 8);

Подзапрос с несколькими уровнями вложенности можно проиллюстрировать на том же примере. Пусть требуется узнать не поставщиков продукта 11, как это делалось в предыдущих запросах, а поставщиков помидоров, являющихся продуктом с номером 11. Для этого можно дать запрос

    SELECT	Название, Статус
    FROM	Поставщики
    WHERE	ПС IN
    	(	SELECT	ПС
    		FROM	Поставки
    		WHERE	ПР IN
    			(	SELECT	ПР
    				FROM	Продукты
    				WHERE	Продукт = 'Помидоры' ));

В данном случае результатом самого внутреннего подзапроса является только одно значение (11). Как уже было показано выше, подзапрос следующего уровня в свою очередь дает в результате множество (1, 5, 6, 8). Последний, самый внешний SELECT, вычисляет приведенный выше окончательный результат. Вообще допускается любая глубина вложенности подзапросов.

Тот же результат можно получить с помощью соединения

    SELECT	Название, Статус
    FROM	Поставщики, Поставки, Продукты
    WHERE	Поставщики.ПС = Поставки.ПС
    AND	Поставки.ПР = Продукты.ПР
    AND	Продукт = 'Помидоры';

При выполнении этого компактного запроса система должна одновременно обрабатывать данные из трех таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно. Естественно, что для их реализации тебуются различные ресурсы памяти и времени, однако этого невозможно ощутить при работе с ограниченным объемом данных в иллюстративной базе ПАНСИОН.

3.3.1 | Содержание | 3.3.3