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

144 Понимание sql

______________________________________________________________________

ГЛ. 12

Имеется запрос который извлекает строки всех продавцов которые имеют

заказчиков с больше чем одним текущим порядком. Это не обязательно са-

мое простое решение этой проблемы, но оно предназначено скорее показать

улучшеную логику SQL. Вывод этой информации связывает все три наши

типовых таблицы:

SELECT *

FROM Salespeople first

WHERE EXISTS

( SELECT *

FROM Customers second

WHERE first.snum = second.snum

AND 1 <

( SELECT COUNT (*)

FROM Orders

WHERE Orders.cnum =

second.cnum ));

Вывод для этого запроса показывается в Рисунке 12.5.

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

| |

| FROM Salespeople first |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers second |

| WHERE first.snum = second.snum |

| AND 1 < |

| (SELECT CONT (*) |

| FROM Orders |

| WHERE Orders.cnum = second.cnum)); |

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

| cnum cname city comm |

| ----- -------- ---- -------- |

| 1001 Peel London 0.17 |

| 1002 Serres San Jose 0.13 |

| 1007 Rifkin Barselona 0.15 |

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

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

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

______________________________________________________________________

Мы могли бы разобрать вышеупомянутый запрос примерно так:

Берем каждую строку таблицы Продавцов как строку-кандидат( внешний

запрос ) и выполняем подзапросы. Для каждой строки-кандидата из вне-

шнего запроса, берем в соответствие каждую строку из таблицы Заказчи-

ков( средний запрос ). Если текущая строка заказчиков не совпадает с те-

кущей строкой продавца( т.е. если first.snum < > second.snum ), предикат

среднего запроса неправилен. Всякий раз, когда мы находим заказчика в

среднем запросе который совдает с продавцом во внешнем запросе, мы

должны рассматривать сам внутренний запрос чтобы определить, будет ли

наш средний предикат запроса верен.

Внутренний запрос считает число порядков текущего заказчика ( из сред-

него запроса ). Если это число больший чем 1, предикат среднего запроса

верен, и строки выбираются.

Это делает EXISTS предикат внешнего запроса верным для текущей строки

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

давца имеет более чем один порядок.

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

примера, не волнуйтесь. Сложность этого примера - хороша независимо

от того, как часто будете Вы использовать ее в деловой ситуации.

Основная цель примеров такого типа состоит в том, чтобы показать вам

некоторые возможности которые могут оказаться в дальнейшем полезными.

После работы со сложными ситуациями подобно этой, простые запросы ко-

торые являются наиболее часто используемыми в SQL, покажутся Вам эле-

ментарными.

Кроме того, этот запрос, даже если он кажется удобным, довольно извилис-

тый способ извлечения информации и делает много работы.

Он связывает три разных таблицы чтобы дать вам эту информацию, а если

таблиц больше чем здесь указано, будет трудно получить ее напрямую

(хотя это не единственный способ, и не обязательно лучший способ в SQL).

Возможно вам нужно увидеть эту информацию относительно регулярной

основы - если, например, вы имеете премию в конце недели для продавца

который получил многочисленые порядки от одного заказчика.

В этом случае, он должен был бы вывести команду, и сохранять ее чтобы

использовать снова и снова по мере того как данные будут меняться

( лучше всего сделать это с помощью представления, которое мы будем

проходить в Главе 20 ).

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