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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 161 >> Следующая


Например, в результате выполнения запросов Q1-Q5 получены значения 1 ООО, 10 ООО, 245, 490 и 9 800, соответственно. Получаются в точности коэффициенты фильтрации и соединения на рис. 5.1, и, если вы умножите все результаты выполнения запросов на одну и ту же константу, то получите те же коэффициенты.

Более сложный пример

Теперь я проиллюстрирую процесс диаграммного изображения для достаточно большого запроса. Я нарисую диаграмму для запроса в примере 5.2, в котором вы видите внешние соединения в старом стиле Oracle (если вы чувствуете себя уверенно, попробуйте нарисовать для этого запроса диаграмму самостоятельно).

Пример 5.2. Более сложный запрос с соединениями восьми таблиц

SELECT С. PhoneJumberi С.Honorific. C.First_Name. C.Last_Name.

С.Suffix, С.Address ID, A.Address ID. A.StreetAddressJinel,

A.Street_Address_Line2. A.City_Name. A.State_Abbreviation,

A.ZIP_Code. DD.Deferred_Shipment_Date. 0D. ItemJount1 ODT.Text. 0T.Text. P.Product_Description. S. ShipmentJate FROM Orders 0. OrderJetails 0D. Products P. Customers C1 Shipments S.

Addresses A. CodeJranslations 0DT. Code_Translations OT WHERE UPPER(C.Last_Name) LIKE :Last_Name||

AND UPPERCC.First_Name) LIKE : First Jame ||T AND 0D.0rder_ID = 0.0rder_ID AND 0.CustomerJD = C.Customer_ID AND 0D.Product_ID = P.Product ID(+)

AND 0D.Shipment_ID = S.Shipment_ID(+)

AND S.Address_ID = A.Address_ID(+)

AND O.Status_Code = 0T.Code AND DT.CodeJype = ‘ORDER STATUS'

AND 0D.StatusJode = ODT.Code

AND 0DT.CodeJype = 'ORDERJETAILJTATUS'

AND 0.OrderJate > :Now - 366 DRDER BY C.CustomerJD. 0.Drder_ID DESC. S.ShipmentJD, DD.OrderJetaiIJD;

Как и раньше, следует игнорировать все части запроса кроме секций FROM и WHERE. У всех таблиц интуитивно понятные имена первичных ключей кроме Code Transl ati ons, первичный ключ которой состоит из двух частей: (Code_Type. Code).

Обратите внимание, что, когда вы находите однотабличное условие равенства по части первичного ключа, как в запросе по CodeJTranslations, следует считать это условие частью условия соединения, а не фильтрации. Если вы обрабатываете однотабличное условие как часть соединения, то обычно рассматриваете фи-
Полные диаграммы запросов

143

зическую таблицу с двумя или несколькими логическими подтаблицами. Я называю их таблицами «с яблоками и апельсинами». Чаще всего это физические таблицы, в которых хранятся в чем-то разные, но связанные между собой типы сущностей. Для оптимизации запроса на этих подтаблицах вас должна интересовать статистика по отдельной подтаблице, к которой обращается запрос. Поэтому выполните все запросы для статистики по таблице, добавив условие, указывающее интересующую вас подтаблицу, и не забудьте запрос для общего количества строк (SELECT C0UNT(*) FROM <Табпица>), который превращается в данном примере в запрос количества подходящих строк (SELECT COUNT(*) FROM Code_Translations WHERE Code_Type='ORDER_STATUS').

Если вы в качестве упражнения хотите завершить скелет диаграммы запроса самостоятельно, выполните перечисленные ранее шаги по созданию диаграммы запроса вплоть до шага 4, и перейдите к рис. 5.4, чтобы посмотреть, все ли получилось правильно.

Изображение соединений к первой центральной таблице

Для выполнения первого шага поместите псевдоним 0 в центр диаграммы. Для шага 2 найдите все соединения с первичным ключом таблицы 0,0. Order_I D. Вы должны найти соединение от OD, которое представлено на рис. 5.2 как указывающая вниз стрелка от OD к 0. Чтобы не забыть, что вы уже изобразили это соединение, вычеркните его из запроса.

OD

T

О

Рис. 5.2. Начало диаграммы для примера 5.2

Изображение соединений от первой центральной таблицы

Переходя к шагу 3, найдите все внешние соединения (не к 0rder_ID, а к внешним ключам) с Orders и добавьте их на диаграмму как стрелки, указывающие вниз от 0 к С и к ОТ, так как эти соединения используют первичные ключи Customers и Code_Transl ations. Теперь диаграмма выглядит как на рис. 5.3.

OD

T

О

с от

Рис. 5.3. Результат шага 3 для второй диаграммы
144

5. Диаграммное изображение простых запросов SQL

Смена центральной таблицы и повторение

На данный момент обработаны все соединения, которые исходят из таблицы с псевдонимом 0. Чтобы не забыть, какая часть работы уже завершена, перечеркните 0 во фразе FROM, и вычеркните соединения, уже изображенные на диаграмме связями. Шаг 4 указывает, что вам необходимо повторить шаги 2 и 3 с новой центральной таблицей, но в нем не говорится, как выбрать новую таблицу. Если вы будете поочередно выбирать центральной каждую таблицу на диаграмме, то завершите диаграмму правильно независимо от порядка, но можно сэкономить время, применив пару правил.

¦ Сначала пытайтесь завершить верхние части диаграммы. Поскольку вы пока не пробовали выбирать верхний узел OD в качестве центрального, начните с него.

¦ Используйте еще не нанесенные на диаграмму соединения для поиска новой центральной таблицы, для которой завершена еще не вся работа. Проверка списка еще не вычеркнутых соединений даст нам следующий список потенциальных кандидатов: 0D, Р, S, А и 0DT. Однако из всего этого списка только OD находится на диаграмме, поэтому это единственный узел, который можно выбрать центральным и расширить диаграмму. Если вы смогли заметить, что с таблицами С и ОТ больше не будет соединений, то следует вычеркнуть их из фразы FROM как не требующих дальнейшей обработки.
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100