КОМБИНАЦИЯ ИЗ EXISTS И ОБЬЕДИНЕНИЯ
Однако для
нас может быть полезнее вывести больше информации об этих продавцах а не только их номера. Мы можем сделать
это
объединив таблицу Заказчиков с таблицей Продавцов ( вывод для запроса показывается в Рисунке 12.3 ):
SELECT DISTINCT first.snum, sname, first.city
FROM Salespeople first, Customers second
WHERE EXISTS ( SELECT * FROM Customers third
WHERE second.snum = third.snum AND second.cnum < > third.cnum )
AND first.snum = second.snum;
cnum |
cname |
city |
1001 |
Peel |
London |
1002 |
Serres |
San Jose |
Рисунок 12.3: Комбинация EXISTS с обьединением
Внутренний запрос здесь - как и в предыдущем варианте, фактически сообщает, что
псевдоним был изменен. Внешний запрос - это обьединение таблицы Продавцов с таблицей Заказчиков,
наподобии того что
мы видели прежде. Новое предложение основного предиката ( AND first.snum = se- cond.snum ) естественно
оценивается на
том же самом уровне что и предложение EXISTS. Это - функциональный предикат самого обьединения, сравнивающий
две
таблицы из внешнего запроса в терминах поля snum, которое являются для них общим. Из-за Булева оператора
AND, оба
условия основного предиката должны быть верны в порядке для верного предиката. Следовательно, результаты
подзапроса
имеют смысл только в тех случаях когда вторая часть запроса верна, а обьединение - выполняемо. Таким
образом
комбинация объединения и подзапроса может стать очень мощным способом обработки данных.