|
Программирование >> Исключение дубликатов строк
Поиск пропущенных значений - €ХС€РТ (Разность) Вернемся снова к задаче с велосипедами и шлемами. Предположим, что вы пытаетесь решить этот, на первый взгляд простой, запрос следуюш.им образом: Show те the orders that contain a bike but not a helmet . ( Показать заказы, содержащие велосипед, но не содержащие шлем .) Преобразование: Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers and product number is not in the list of helmet product numbers (Выбрать неповторяюпдиеся номера заказов из таблицы Детали заказов , где номер товара Уточнение находится в списке номеров товаров велосипед и не находится в списке номеров товаров шлем .) Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers and product number is not in the list of helmet product numbers (Выбрать неповторяющиеся номера заказов из Детали заказов , где номер товара в номерах товаров велосипед и не в номерах товаров шлем ) SELECT DISTINCT OrderNumber FROM OrderDetails WHERE ProductNumber IN (1, 2, 6, AND ProductNumber NOT IN (10, 25, 26) К сожалению, ответ покажет только заказы, содержащие велосипед! Проблема состоит в том, что первое IN условия находит строки, содержащие велосипед, но второе условие IN просто исключает строки со шлемом. Если графически представить Заказы на велосипеды и Заказы на щлемы как два отдельных множества, это будет легче понять. На рис. 7.9 показана возможная связь между этими двумя множествами заказов. Если в запросе встречается except (за исключением) или but not (кроме), это предполагает, что решение требуется разделить на два отдельных множества данных, а затем каким-либо образом связать их. (Ваш запрос также необходимо разделить на две части.) Заказы на вэлосипед, но не на шлем Рис, 7.9. Заказы на велосипед, не содержащие заказа на шлем Show те the orders that contain a bike . ( Показать заказы, содерэюащие велосипед .) Преобразование: Select the distinct order numbers from the order details table where the product number is in the list of bike product numbers (Выбрать неповторяющиеся номера заказов из таблицы Детали заказов , где номер товара находится в списке номеров товаров велосипед ) Уточнение: Select the distinct order numbers from the order details table where the product number ts in the list of bike product numbers (Выбрать неповторяющиеся номера заказов из Детали заказов , где номер товара среди номеров товаров велосипед ) SQL SELECT DISTINCT OrderNumber FROM OrderDetails WHERE ProductNumber IN (1, 2, 6, 11) Show me the orders that contain a helmet . ( Показать заказы, содержашие шлем .) Преобразование: Select the distinct order numbers from the order details table where the product number is in the list of helmet product numbers (Выбрать неповторяющиеся номера заказов из таблицы Детали заказов , где номер товара находится в списке номеров товаров шлем ) Уточнение: Select the distinct order numbers from the order details table where the product number in the list of helmet product numbers (Выбрать неповторяющиеся номера заказов из Детали заказов , где номер товара среди номеров товаров шлем ) SQL SELECT DISTINCT OrderNumber FROM Order.Details WHERE ProductNumber IN (10, 25, 26) Теперь можно получить окончательное решение, используя разность двух множеств. В SQL для обозначения операции разности используется ключевое слово EXCEPT. На рис. 7.10 представлена синтаксическая диаграмма SQL, которая решает эту проблему. Выражвииф SiLBCT о- Оператор SELBCT iVii i.ii EXCEPT Оператор SELECT Рис. 7.10. Связывание двух операторов SELECT в EXCEPT Теперь можно объединить две части запроса в операторе EXCEPT, чтобы полу- чить правильный ответ: SELECT DISTINCT OrderNumber FROM Orcler Details WHERE ProductNumber IN (1, 2. 6, 11) EXCEPT SELECT DISTINCT OrderNumber FROM Order.Details WHERE ProductNumber IN (10, 25, 26) Вспомните, что последовательность множеств имеет значение. В нашем случае мы обраш,аемся с запросом о велосипедах за исключением шлемов. Если нужно узнать иное заказы на шлемы, которые не содержат заказов на велосипеды, можно выполнить преобразование следуюш.им образом: SELECT DISTINCT OrderNumber FROM Order Details WHERE ProductNumber IN (10, 25, 26) EXCEPT SELECT DISTINCT OrderNumber FROM Order Details WHERE ProductNumber IN (1, 2, 6. 11) Пока еш.е мало коммерческих реализаций SQL поддерживают оператор EXCEPT. Крепче держите свой шлем! Однако вспомните, что первичный ключ таблицы уникальным образом идентифицирует каждую строку (не требуется совпадения по всем полям в строке - только по первичному ключу - для поиска уникальных строк, которые различаются ). В главе 9 мы покажем альтернативный метод OUTER JOIN, который может решать этот тип проблем другим способом. Большинство коммерческих реализаций SQL поддерэ/сивают OUTER JOIN. Объединение множесто UNION Еш,е один пример с велосипедами и шлемами. Допустим, нужно решить следую-Ш.ИЙ запрос, который при поверхностном взгляде кажется достаточно простым: Show те the orders that contain either a bike or a helmet . ( Показать заказы, содероюащие либо велосипед, либо шлем .)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |