Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

140 Понимание sql

______________________________________________________________________

ГЛ. 12

соотнесенный подзапрос. Это дает возможность использовать EXISTS как

верный предикат, который генерирует различные ответы для каждой строки

таблицы указанной в основном запросе. Следовательно информация из внут-

реннего запроса, будет сохранена, если выведена непосредственно, когда вы

используете EXISTS таким способом. Например, мы можем вывести продав-

цов которые имеют многочисленых заказчиков ( вывод для этого запроса

показывается в Рисунке 12.2 ):

SELECT DISTINCT snum

FROM Customers outer

WHERE EXISTS

( SELECT *

FROM Customers inner

WHERE inner.snum = outer.snum

AND inner.cnum < > outer.cnum );

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

| |

| SELECT DISTINCT cnum |

| FROM Customers outer |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers inner |

| WHERE inner.snum = outer.snum |

| AND inner.cnum < > outer.cnum); |

| ============================================= |

| cnum |

| ----- |

| 1001 |

| 1002 |

=============================================

Рисунок 12. 2: Использование EXISTS с соотнесенным подзапросом

Для каждой строки-кандидата внешнего запроса ( представляющей заказ-

чика проверяемого в настоящее время ), внутренний запрос находит стро-

ки которые совпадают со значением поля snum ( которое имел продавец ),

но не со значением поля cnum ( сответствующего другим заказчикам ).

Если любые такие строки найдены внутренним запросом, это означает,

что имеются два разных заказчика обслуживаемых текущим продавцом

ИСПОЛЬЗОВАНИЕ EXISTS ОПЕРАТОРА 141

______________________________________________________________________

( то-есть продавцом заказчика в текущей строке-кандидата из внешнего за-

проса ). Предикат EXISTS поэтому верен для текущей строки, и номер про-

давца поля (snum) таблицы указанной во внешнем запросе будет выведено.

Если был DISTINCT не указан, каждый из этих продавцов будет выбран

один раз для каждого заказчика к которому он назначен.

КОМБИНАЦИЯ ИЗ 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 с обьединением

Соседние файлы в папке ПОНИМАНИЕ SQL