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

1 ... 66 67 68 [ 69 ] 70 71 72 ... 152


Поиск пропущенных значений - €ХС€РТ (Разность)

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

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 . ( Показать заказы, содероюащие либо велосипед, либо шлем .)



1 ... 66 67 68 [ 69 ] 70 71 72 ... 152

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