Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / БД2012 / Understanding.SQL.doc
Скачиваний:
281
Добавлен:
28.03.2015
Размер:
1.75 Mб
Скачать

Комбинация из 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;

=============== SQL Execution Log ============

| |

| 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 = second.snum ) естественно оценивается на том же самом уровне что и предложение EXISTS. Это - функциональный предикат самого объединения, сравнивающий две таблицы из внешнего запроса в терминах пол snum, которое являются для них общим. Из-за Булева оператора AND, оба условия основного предиката должны быть верны в порядке для верного предиката. Следовательно, результаты подзапроса имеют смысл только в тех случаях когда вторая часть запроса верна, а объединение - выполнимо. Таким образом, комбинация объединения и подзапроса может стать очень мощным способом обработки данных.

Использование not exists

Предыдущий пример дал понять что EXISTS может работать в комбинации с операторами Бул. Конечно, то что является самым простым способом для использования и вероятно наиболее часто используется с EXISTS - это оператор NOT. Один из способов которым мы могли бы найти всех продав- цов только с одним заказчиком будет состоять в том, чтобы инвертировать наш предыдущий пример. ( Вывод для этого запроса показывается в Рисунке 12.4:) SELECT DISTINCT snum FROM Customers outer WHERE NOT EXISTS ( SELECT * FROM Customers inner WHERE inner.snum = outer.snum AND inner.cnum < > outer.cnum );

Соседние файлы в папке БД2012