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

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

Читайте также:
  1. Коррелированный подзапрос в разделе HAVING
  2. Подзапросы с IN
  3. Применение коррелированного подзапроса в условии WHERE

Выбрать фамилии поставщиков, поставляющих деталь "винт". Этот пример уже рассматривался. Однако для иллюстрации проблемы, рассматриваемой в данном разделе, приведем иное решение этой задачи.

SELECT ФАМИЛИЯ FROM Поставщики WHERE 'винт' IN (SELECT Название FROM Детали WHERE НОМЕР_ПОСТАВЩИКА = Поставщики. НОМЕР_ПОСТАВЩИКА);


Пояснение. В последней строке приведенного запроса неуточненная ссылка на НОМЕР_ПОСТАВЩИКА уточняется неявным образом именем таблицы Детали. Другая ссылка явно уточняется именем таблицы Поставщики. Этот пример отличается от предыдущих тем, что внутренний подзапрос не может быть обработан раз навсегда прежде, чем будет обрабатываться внешний запрос, поскольку этот внутренний подзапрос зависит от переменной, а именно от Поставщики.НОМЕР_ПОСТАВЩИКА, значение которой изменяется по мере того, как система проверяет различные строки таблицы Поставщики. Следовательно, с концептуальной точки зрения обработка осуществляется следующим образом.

  1. Система проверяет первую строку таблицы Поставщики. Предположим, что это строка поставщика 1. Тогда переменная Поставщики.НОМЕР_ПОСТАВЩИКА в данный момент имеет значение 1, и система обрабатывает внутренний запрос
b. SELECT Названиеc. FROM Деталиd. WHERE НОМЕР_ ПОСТАВЩИКА = 1;

получая в результате множество ('гайка', 'болт'). Теперь она может завершить обработку для 1 поставщика. Выборка значения ФАМИЛИЯ для 1, а именно Смит, будет произведена тогда и только тогда, когда 'винт' принадлежит этому множеству, что, очевидно, несправедливо.

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

Такой подзапрос, как в этом примере, называется коррелированным. Коррелированный подзапрос - это такой подзапрос, результат которого зависит от некоторой переменной. Эта переменная принимает свое значение в некотором внешнем запросе. Обработка такого подзапроса, следовательно, должна повторяться для каждого значения переменной в запросе, а не выполняться раз навсегда. Далее будет приведен другой пример коррелированного подзапроса.

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

Выдать номера поставщиков, находящихся в том же городе, что и поставщик №1.

SELECT * FROM Поставщики WHERE ГОРОД = (SELECT ГОРОД FROM Поставщики WHERE НОМЕР_ПОСТАВЩИКА = 1);


Результат:

Номер_Поставщика Фамилия Город 1 Смит Лондон 4 Кларк Лондон


Иногда пользователь может знать, что заданный подзапрос должен возвратить в точности одно значение, как в рассматриваемом примере. В таком случае можно использовать вместо обычного IN более простой оператор сравнения (например, =, > и т. д.). Однако, если подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка. Ошибка не возникнет, если подзапрос не возвратит вообще ни одного значения. При этом сравнение интерпретируется в точности так, как если бы подзапрос возвратил неопределенное значение. Более того, подзапрос не может включать фразу GROUP BY, если он используется с простым оператором сравнения, например с =, > и т. д.


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



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