Программирование >>  Исключение дубликатов строк 

1 ... 52 53 54 [ 55 ] 56 57 58 ... 152


Предположим, что к базе данных обращаются со следующим запросом:

Show те the location and date of any tournament not being held at Bolero Lanes, Imperial Lanes, or thunderbird Lanes . ( Показать места проведения и даты всех турниров, которые проводятся не в Болеро Лэйнс, Империал Лэйнс или Зандербирд Лэйнс .)

Вероятно, вы уже догадались, что для ответа на этот запрос будет использоваться условие принадлежности. Теперь просто требуется решить, как его определить. Одним из подходов является использование оператора NOT в предикате:

WHERE Tourney Location NOT IN (Bolero Lanes, Imperial Lanes, Thunderbird Lanes)

Другим подходом является использование оператора NOT как первого ключевого слова до условия поиска:

WHERE NOT TourneyLocation IN (Bolero Lanes, Imperial Lanes, Thunderbird Lanes)

Любое условие исключит из набора результатов турниры, которые проводятся в Болеро Лэйнс, Империал Лэйнс или Зандербирд Лэйнс. Однако одним из преимуществ использования NOT перед условием поиска является то, что его можно применить к условию сравнения. (Вспомните, что синтаксическая структура условия сравнения не включает NOT, как необязательный оператор.) Но теперь можно использовать условие сравнения для исключения строк из набора результатов. В следующем примере показано, как можно использовать этот тип условий:

Show те the bowlers who live outside of Bellevue . ( Показать игроков, не проживающих в Беллевью .)

Преобразование: Select first name, last name, and city from the bowlers

table where the city is not Bellevue (Выбрать имя, фамилию и город из таблицы Игроки в боулинг , где город - не Беллевью)

Уточнение: Select first name, last name, шё city from the bowlers

table where the city not == Bellevue (Выбрать имя, фамилию, город из Игроки в боулинг , где город не = Беллевью)

SQL SELECT BowlerFirstName, BowlerLastName, BowlerCity

From Bowlers

WHERE NOT BowlerCity = Bellevue

Да, можно выразить это условие как WHERE BowlerCity о Bellevue. Этот пример просто подчеркивает, что условие можно выразить различными способами.



Примите во внимание проблему, которая может возникнуть, когда определяется

sIOT, которые будут включать строки вместо того, чтобы исключать их. Вот пример:

Which staff members are not a teacher or a teachers aide? ( Кто из сотрудников не является преподавателем или помощником преподавателя? )

Преобразование:

Уточнение:

Select first name, last name, and title from the staff table where the title is not teacher or teachers aide (Выбрать имя, фамилию и должность из таблицы Персонал , где должность не преподаватель и не помощник преподавателя )

Select first name, last name, апё title from the staff table where the title i not in ( teacher of teachers aide ) (Выбрать имя, фамилию, должность из Персонал , где должность не из ( преподаватель , помощник преподавателя ))

SELECT StfFirstName, StfLastNaffie, Title FROM Staff WHERE NOT Title

NOT IN (Teacher, Teacher s Aide)

Внимание! Поспорим, что удивление вызывают две одиночные кавычки в литерале типа символьной строки - Teacher s Aide. Стандарт SQL диктует, что одиночная кавычка используется для отделения символьной строки или литерала дата/время. Когда необходимо вставить одиночную кавычку в литерал символьной строки, следует информировать о ней систему базы данных путем ввода одиночной кавычки два раза. Если этого не сделать, одиночная кавычка будет действовать как конечный ограничитель символьной строки, s Aide , возникающее после второй одиночной кавычки, будет генерировать синтаксическую ошибку!

Предполагается, конечно, что один из двух операторов NOT появляется по ошибке. Можно выполнять этот оператор SELECT, но он будет отправлять неверные строки в набор результатов. В данном случае два оператора NOT аннулируют друг друга, как двойное отрицание в арифметике или в языке, а предикат IN теперь определяет, какие строки отправляются в набор результатов. Поэтому вместо поиска тех, кто не является преподавателем или помощником преподавателя, вы будете искать только преподавателей или помощников преподавателей. Хотя таким образом невозможно осознанно определить преподавателя или помощника преподавателя в условии поиска, это вполне можно сделать случайно. Это часто является просто ошибкой, вызывающей большинство проблем.



Порпдок предшествования

Стандарт SQL определяет, как СУБД должна анализировать единые условия в условии поиска и порядок выполнения этой оценки. Из этой главы уже стало известно, как база данных анализирует каждый тип условий. Теперь покажем, как база данных определяет, когда анализировать каждое отдельное условие.

По умолчанию база данных анализирует условия слева направо. Это особенно верно в случае простых условий. В приведенном ниже примере оператор SELECT вначале осуществляет поиск строк, для которых дата поставки совпадает с датой заказа, а затем определяет, какие строки содержат клиента с номером 1001. Строки, которые удовлетворяют обоим условиям, отправляются в набор результатов.

SELECT CustomerlD, OrderDate, FROM Orders

WHERE ShipDate = OrderDate AND CustomerlD = 1001

ShipDate

Для того чтобы оператор SELECT выполнил поиск номера конкретного клиента прежде анализа даты поставки, просто пере-

ставьте позиции условии.

Когда условие поиска содержит различные типы отдельных условий, база данных оценивает их в конкретном порядке, исходя из оператора, используемого в каждом условии. Стандарт SQL определяет следующий порядок

Порядок анализа

Тип оператора

Знак плюс ( + ), знак минус (-)

Умножение (*), деление (/)

Сложение ( + ), вычитание (-)

BETWEEN, IN, LIKE, IS NULL

действии при анализе операторов (см. табл. справа).

В следующем примере оператор SELECT содержит такое условие поиска, которое заставляет систему БД обратиться к порядку предшествования. В данном случае база данных выполняет операцию сложения, осуществляет сравнения и определяет, удовлетворены ли все условия. Любая строка, которая удовлетворяет обоим условиям, заносится в набор результатов.

SQL SELECT CustomerlD, OrderDate, ShipDate

FROM Orders

WHERE CustomerlD = 1001 OR ShipDate = OrderDate + 4

Расположение условий a порпдке приоритетов

Можно значительно повысить точность условий поиска, если понимать порядок предшествования. Это поможет правильно сформулировать условие для рассматриваемого запроса. Но нужно быть осторожным и определять только однозначные условия, которые не могут дать непредвиденные результаты.



1 ... 52 53 54 [ 55 ] 56 57 58 ... 152

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика