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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 118 119 120 121 122 123 < 124 > 125 126 127 128 129 130 .. 161 >> Следующая


Иногда вам приходится настраивать составные запросы, в которых используются операции над множествами, такие, как UNION, UNION ALL, INTERSECT и EXCEPT для комбинирования результатов двух или более простых запросов. Расширение метода настройки с диаграммами SQL на эти составные запросы выполняется просто: создавайте диаграмму и настраивайте все части независимо, как если бы они были отдельными запросами. Если отдельные части работают быстро, то и комбинирование результатов при помощи групповых операций работает хорошо.

ПРИМЕЧАНИЕ--------------------------------------------------------

EXCEPT — это ключевое слово, описанное в стандарте ANSI SQL для операций над множествами, предназначенное для поиска различий между двумя наборами. DB2 и SQL Server следуют стандарту, поддерживая оператор EXCEPT. Однако в Oracle для выполнения той же операции используется MINUS, вероятно, потому, что Oracle поддерживала ее еще до введения стандарта.

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

Операцию INTERSECT обычно можно с успехом заменять подзапросом типа EXISTS, который ищет подходящую строку, которую выдала бы вторая часть. Например, если у вас есть две таблицы Employees, вы можете провести поиск совместно используемых записей сотрудников при помощи:

SELECT Employee_ID FROM Employeesl INTERSECT

SELECT Employee_ID FROM Employees2

Запрос INTERSECT всегда можно заменить следующей конструкцией:

SELECT DISTINCT EmployeeJD FROM Employeesl El WHERE EXISTS (SELECT null

FROM Employees2 E2

WHERE El.Employee_ID - E2.Employee_ID)

Используя методы, описанные в разделе «Запросы с подзапросами», вы бы могли определить, нужно ли подзапрос типа EXISTS выразить в форме EXISTS или IN или следует преобразовать его в простое соединение. Обратите внимание, что условия корреляционного соединения сильно разрастаются, если в списке SELECT
Упражнение

251

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

SELECT EmployeeID. Manager_ID FROM Employeesl INTERSECT

SELECT Employee_ID. Manager_ID FROM Employees2

можно использовать эквивалентный запрос:

SELECT DISTINCT EmployeeJD. ManagerJD FROM Employeesl El WHERE EXISTS (SELECT null

FROM Employees2 E2

WHERE El.Employee ID = E2.EmployeeJD

AND NVL (El. ManagerJD. -1) = NVL (E2. Manager ID.-I))

Выражение NVL(_____-I) в условии второго корреляционного соединения преоб-

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

Операцию EXCEPT (или MINUS) обычно можно с успехом заменять подзапросом типа NOT EXISTS. Для поиска записей сотрудников в первой таблице, но не во второй, вы могли бы воспользоваться таким запросом:

SELECT EmployeeJD FROM Employeesl MINUS

SELECT EmployeeJD FROM Employees2

Ho его всегда можно заменить иным запросом:

SELECT DISTINCT EmployeeJD

FROM Employeesl El

WHERE NOT EXISTS (SELECT null

FROM Employees2 E2

WHERE El.EmployeeJD = E2.EmployeeJD)

И тогда запрос можно обрабатывать, используя методы, описанные ранее в разделе «Запросы с подзапросами».

Упражнение

Далее представлен невообразимо сложный запрос, предназначенный для глубокой проверки вашего понимания настройки запросов с подзапросами. На рис. 7.36 показана более сложная и запутанная диаграмма запроса, чем любая, с которой вы встретитесь за целый год интенсивной настройки SQL. Если вы сможете справиться с такой диаграммой, то решите и любой сценарий с подзапросами, который встретится вам в реальной жизни, поэтому попытайтесь выполнить упражнение.

ПРИМЕЧАНИЕ-----------------------------------------------------------------------

Если вам не удастся справиться с задачей с первого раза, вернитесь к ней и попытайтесь еще раз после дополнительной практики и повторного изучения материала.
252

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

D2 0.5 D3

BI 0.8 В2

Рис. 7.36. Сложная задача с несколькими подзапросами

Найдите отсутствующие коэффициенты для корреляционных соединений. Предполагайте, что t - 5 (количество строк, возвращенное всем запросом, включая подзапрос NOT EXISTS), a q - 50 (количество строк, возвращенное запросом, если из него убрать условие NOT EXISTS). Найдите лучший порядок соединения, включая все таблицы в подзапросах и во внешнем запросе.
Предыдущая << 1 .. 118 119 120 121 122 123 < 124 > 125 126 127 128 129 130 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100