Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 112

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 106 107 108 109 110 111 < 112 > 113 114 115 116 117 118 .. 161 >> Следующая


Внешние соединения с детальной таблицей с фильтром

На рис. 7.26 показано внешнее соединение с детальной таблицей, для которой также существует фильтрующее условие. Иногда две ошибки компенсируют друг друга. Внешнее соединение с детальной таблицей, имеющей фильтр, может представ-

Т1

Т2

/ \

Рис. 7.25. Внешнее соединение по направлению к детальной таблице

В новом стиле записи ANSI это может быть запрос следующего вида:

SELECT ...

FROM Departments D

LEFT OUTER JOIN Employees E

ON D. Department^ D = E.Department_ID
228

7. Диаграммное изображение и настройка сложных SQL-запросов

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

Tl 03

г

Т2

Рис. 7.26. Внешнее соединение с фильтрованной детальной таблицей

Наиболее интересный случай, который может проиллюстрировать рис. 7.26, — когда фильтр имеет смысл только в контексте внешнего соединения. Это случай, когда фильтрующее условие для Tl истинно только во внешнем случае — например, Tl.Fkey_ID IS NULL. (Здесь Tl.Fkey_ID — это внешний ключ, указывающий на Т2. PKey_ID в показанном на диаграмме соединении.) Как и в предыдущем примере условия IS NULL для значения ключа соединения (тогда это был первичный ключ), этот случай эквивалентен подзапросу NOT EXISTS. Так же, как и в том примере, это необычное выражение условия NOT EXISTS иногда обеспечивает дополнительную степень контроля над местом в плане исполнения, когда база данных выполняет соединение и отбрасывает строки, не удовлетворяющие условию. Так как все строки, присоединенные во внутреннем случае, отбрасываются условием IS NULL, мы избегаем обычной проблемы внешних соединений с детальными таблицами — смешивания различных сущностей в строках, полученных во внутреннем и внешнем случаях соединения. Опять две ошибки компенсируют друг друга!

Запросы с подзапросами

Практически все реальные запросы с подзапросами включают особый вид условий для строк во внешнем, главном запросе; они должны соответствовать или не соответствовать подходящим строкам в связанном запросе. Например, если вам нужны данные об отделах, в которых есть сотрудники, вы можете использовать такой запрос:

SELECT ...

FROM Departments D WHERE EXISTS (SELECT NULL

FRDM Employees E

WHERE E.Department_ID - D.Department_ID)

Или же вы можете запросить данные об отделах, в которых нет сотрудников:

SELECT ... FROM Departments D WHERE NDT EXISTS (SELECT NULL

FROM Employees E

WHERE E.Department_ID - D.Department_ID)
Запросы с подзапросами

229

Соединение E. Department_ID = D. DepartmentJD в каждом из этих запросов — это корреляционное соединение, которое ставит в соответствие друг другу строки во внешнем запросе и подзапросе. У запроса EXISTS есть альтернативная эквивалентная форма:

SELECT ...

FROM Departments D

WHERE D.DepartmentJD IN (SELECT E.DepartmentJD FROM Employees E)

Так как функционально эти формы эквивалентны, а диаграмма должна быть непредвзятой по отношению к обеим формам, то диаграммы для них выглядят одинаково. Tолько после оценки диаграммы следует делать выбор, какая из форм лучше решает проблему настройки и выражает лучший путь к данным.

Изображение запросов с подзапросами на диаграммах

Игнорируя соединение, которое связывает внешний запрос с подзапросом, вы всегда можете создать отдельные, независимые диаграммы запросов для каждого из двух запросов. Единственный открытый вопрос — как следует представлять отношение между этими двумя диаграммами, которое объединяет их в одну. Как объясняет форма EXISTS предыдущего запроса, внешний запрос связан с подзапросом при помощи корреляционного соединения. У этого соединения есть особое свойство — для каждой строки внешнего запроса база данных прекращает поиск соответствующих строк, считает условие EXISTS удовлетворенным и передает строку внешнего запроса на следующий этап плана исполнения, как только найдет первое соответствие для данного соединения. Когда она находит соответствие для коррелированного подзапроса NOT EXISTS, то прекращает работу, считая условие NOT EXISTS не удовлетворенным, и немедленно отбрасывает строку из внешнего запроса, не выполняя с ней более никаких действий. Такое поведение подразумевает, что диаграмма запроса должна отвечать на четыре особых вопроса о корреляционном соединении. Эти вопросы неприменимы к обычным соединениям.

¦ Это обычное соединение? (Нет, это корреляционное соединение с подзапросом.)

¦ Какая сторона соединения является подзапросом, а какая — внешним запросом?

¦ Его можно выразить как запрос EXISTS или как запрос NOT EXISTS?

¦ Как скоро в плане исполнения следует выполнять подзапрос?

Работая с подзапросами и рассматривая эти вопросы, помните, что вам все так же нужно передать на диаграмме свойства, характерные для любых соединений — какой конец соединения относится к главной таблице и каковы коэффициенты соединения.
Предыдущая << 1 .. 106 107 108 109 110 111 < 112 > 113 114 115 116 117 118 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100