|
Программирование >> Полное сканирование таблицы
в запросе, обращающемся только к базовой таблице без ненужного соединения, проверьте, было ли предыдущее поведение правильным. Если ващи изменения незаметно изменят работу запроса, даже в лучшую сторону, предупредите тестеров, что результаты тестирования могут измениться в этом случае. Запросы с операциями над множествами Иногда вам приходится настраивать составные запросы, в которых используются операции над множествами, такие, как 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 EmployeeJD FROM Employeesl INTERSECT SELECT Eniployee ID FROM Employees2 Запрос INTERSECT всегда можно заменить следующей конструкцией: SELECT DISTINCT Employee ID FROM Employeesl El WHERE EXISTS (SELECT null FROM £mployees2 E2 WHERE El.Employee ID = E2.Employee ID) Используя методы, описанные в разделе Запросы с подзапросами , вы бы могли определить, нужно ли подзапрос типа EXISTS выразить в форме EXISTS или IN или следует преобразовать его в простое соединение. Обратите внимание, что условия корреляционного соединения сильно разрастаются, если в списке SELECT содержится много элементов. Также обратите внимание, что INTERSECT будет ставить в соответствие спискам столбцов значения null, что корреляционное соединение делать не будет, если только вы не укажете условия соединения специально для этой цели. Например, если для положительного внешнего ключа Manager ID разрешено значение null (а значение Employee ID не может быть null), то в Oracle вместо запроса SELECT Employee ID. Manager ID FROM Employeesl INTERSECT SELECT Employee ID, Manager ID FROM Employees2 можно использовать эквивалентный запрос: SELECT DISTINCT Employee ID. Manager ID FROM Employeesl El WHERE EXISTS (SELECT null FROM Employees2 E2 WHERE El.Employee ID = E2.Employee ID AND NVL(El.Manager ID,-l) = NVL(E2.Manager ID.-l)) Выражение NVL ( -1) в условии второго корреляционного соединения преобразовывает значения null в столбцах, где оно допустимо, чтобы, когда значению null сопоставляется также null, соединение было успешно проведено. Операцию EXCEPT (или MINUS) обычно можно с успехом заменять подзапросом типа NOT EXISTS. Для поиска записей сотрудников в первой таблице, но не во второй, вы могли бы воспользоваться таким запросом: SELECT Employee ID FROM Employeesl MINUS SELECT EmployeelD 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. Если вы сможете справиться с такой диаграммой, то решите и любой сценарий с подзапросами, который встретится вам в реальной жизни, поэтому попытайтесь вьшолнить упражнение. ПРИМЕЧАНИЕ Если вам не удастся справиться с задачей с первого раза, вернитесь к ней и попытайтесь еще раз после дополнительной практики и повторного изучения материала. А10.2 А20.7 D4 0.001 Т t S8 0.1 S70.7 BIOS Рис. 7.36. Сложная задача с несколькими подзапросами Найдите отсутствующие коэффициенты для корреляционных соединений. Предполагайте, что t - 5 (количество строк, возвращенное всем запросом, включая подзапрос NOT EXISTS), а q - 50 (количество строк, возврашенпое запросом, если из него убрать условие NOT EXISTS). Найдите лучший порядок соединения, включая все таблицы в подзапросах и во внешнем запросе.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |