|
Программирование >> Исключение дубликатов строк
С помощью следующего примера рассмотрим эту потенциальную проблему: SQL SELECT CustFirstName, CustLastName, CustState, CustZipCode FROM Orders WHERE CustLastName = Patterson AND CustState = CA OR CustZipCode LIKE ХЭ В этом случае трудно определить реальную цель условия поиска, потому что ее можно интерпретировать двумя способами: 1. Осуществляется поиск кого-то с именем Patterson из штата Калифорния или кого-то с почтовым кодом, который заканчивается на 9. 2. Осуществляется специальный поиск всех с именем Patterson и кого-то, кто проживает в Калифорнии или у кого почтовый код заканчивается на 9. Можно избежать этой неоднозначности и сделать условие поиска более понятным, используя скобки для объединения и назначения приоритета определенным условиям. Например, чтобы получить первую интерпретацию условия поиска, нужно определить условие WHERE следующим образом: WHERE (CustLastName = Patterson AND CustState = CA) OR CustZipCode LIKE ХЭ Скобки гарантируют, что база данных проанализирует и оценит два условия сравнения до выполнения тех же процессов для условия совпадения с образцом. Можно получить вторую интерпретацию и определить условие WHERE следующим образом: WHERE CustLastName = Patterson AND (CustState = CA OR CustZipCode LIKE XQ) В данном случае база данных анализирует и выполняет оценку первого условия сравнения после выполнения этих же процессов д/ш второго условия сравнения и условия совпадения с образцом. Смысл заключения условий в скобки должен быть хорошо вам понятен. Применение скобок может оказать серьезное влияние на результат условия поиска. Можно использовать любое количество условий, заключенных в скобки, и даже вкладывать их. А вот как база данных обрабатывает условия в скобках: Условия в скобках обрабатываются до условий, не заключенных в скобки. Два или более условий в скобках обрабатываются слева направо. Вложенные условия в скобках обрабатываются от внутренних к внешним. Как только база данных начинает анализировать некоторое условие в скобках, она оценивает все выражения в этом условии, используя обычный порядок предшествования. Если внимательно преобразовывать запрос и эффективно использовать скобки в условии поиска, можно достичь лучших результатов. Чем меньше - тем лучше База данных первоначально анализирует условия слева направо, и порядок предшествования применяется, когда определяются и используются сложные условия. Способ использования скобок в условии поиска оказывают прямое воздействие на результат. Дадим простой обший совет по ускорению процесса условия поиска: запрашивайте меньше, т. е. выбирайте только те столбцы, которые необходимы для выполнения запроса, и как можно больше конкретизируйте условия запроса, чтобы база данных обрабатывала наименьшее возможное количество строк. Если требуется использовать несколько условий, убедитесь в том, что условие, исключаюшее большинство строк из набора результатов, обрабатывается в первую очередь (именно здесь действительно полезно понимание порядка предшествования). Продемонстрируем все это на примере, который уже использовался ранее: SQL SELECT CustomerlD, OrderDate, ShipDate FROM Orders WHERE ShipDate = OrderDate AND CustomerlD = 1001 В данном случае строка должна выполнить оба условия для того, чтобы она была включена в набор результатов. Размешение предикатов в таком порядке может каждой датой заказа. В зависимости от количества строк в таблице базе данных может потребоваться некоторое время для оценки этого условия. Затем база данных будет осушествлять поиск строк, удовлетворяюших первому условию, чтобы определит, какие из них содержат идентификатор клиента, равный 1001. Вот лучший способ для определения условия: SQL SELECT CustomerlD, OrderDate, ShipDate FROM Orders WHERE CustomerlD = 1001 AND ShipDate = OrderDate Теперь база данных скорее всего вначале выполнит поиск идентификатора клиента. Это условие, вероятно, даст небольшое количество строк, и поэтому базе данных потребуется меньше времени для поиска тех строк, которые совпадают с предикатом даты поставки. Этот метод следует сделать обычной практикой и применять его при определении условий поиска. Потребуется много времени, чтобы гарантировать быстрое и эффективное выполнение операторов SELECT. Обязательно изучите документацию на систему базы данных и узнайте, какие другие методы можно использовать для еще большей оптимизации оператора SELECT. Повторная встреча с NULL: Предупреждающее замечание Сейчас подходящий момент напомнить о Null. Как вы знаете. Null представляет собой отсутствие значения, и выражение, обрабатывающее значение Null, возвращает Null. Это справедливо также и для условий поиска. Предикат, который выполняет оценку значения Null, Mooicem никогда не иметь значения True. Мало того - также тат любого предиката, в состав операндов которого входит Null, как Unknown (Неизвестно). Вспомните, что для выборки строки предикат должен иметь значение True, поэтому при значениях False или Unknown она отклоняется. Второе выражение
Рис. 6.12 Результат объединения двух предикатов типа выражение в операторе AND Чтобы помочь прояснить вопрос, посмотрим еще раз на .таблицы для значений Истина на рис. 6.12 и 6.13, которые были первоначально представлены на рис. 6.9 и 6.10. Но на этот раз включим результат Unknown (Неизвестно), который можно получить, если используется значение Null. Можно видеть, что результат Unknown анализа предиката на столбце с Null в действительности усложняет картину! Например, предположим, что имеется простой предикат сравнения: А = В. Если либо А, либо В для данной строки имеет значение Null, то результат сравнения - Unknown.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |