|
Программирование >> Исключение дубликатов строк
Преобразование: Select the distinct order numbers from the order details table where the product number is in the list of bike and helmet product numbers (Выбрать несовпадающие номера заказов из таблицы Детали заказа , где номер товара присутствует в списке номеров товаров для велосипеда и шлема) Уточнение: Select the distinct order numbers from the order details table where the product number ts in the list of bike and helmet product numbers (Выбрать несовпадающие номера заказов из Детали заказа , где номер товара в номерах товаров для велосипеда и шлема) SELECT DISTINCT OrderNumber FROM Order Details WHERE ProductNumber IN (1, 2, 6, 10. 11, 25, 26) Внимание! Читатели, хорошо знакомые с SQL, MOiyT спросить, почему мы не объединили (JOIN) Order Details (Детали заказа) с Products (Товары) и не выполнили поиск велосипеда и шлема по наименованиям товаров. Дело в том, что мы еще не представили концепцию JOIN, поэтому строим показанный выше пример на единой таблице, применяя IN и список известных номеров товаров для велосипеда и шлема. Рис. 7.6. Единственная возможная связь между двумя множествами заказов Вначале это кажется фокусом, но ответ включает заказы, которые содержат либо велосипед, либо шлем, а требовалось найти такие, которые содержат оба товара. Если представить графически Заказы на велосипеды и Заказы на шлемы как два отдельных множества, будет легче понять проблему. На рис. 7.6 показано возможное отношение между двумя множествами заказов с использованием диаграммы для множеств. Фактически отсутствует способ предварительного предсказания, какими могут быть отношения ме>кду двумя множествами данных. На рис. 7.6 некоторые заказы содержат в списке заказанных товаров велосипед, но не содержат шлем. Другие содержат шлем, но нет велосипеда. В области перекрытия. или пересечения, двух множеств находятся заказы, которые содержат как велосипед, так и шлем. На рис. 7.7 представлен другой случай, когда все заказы, содержашие шлем, также содержат велосипед, но некоторые заказы, содержаш,ие велосипед, не содержат шлема. Наличие в запросе слова both ( оба ) предполагает, что вы, вероятно, разделите решение на отдельные множества данных, а затем каким-либо образом свяжете эти два множества. (Ваш запрос также требуется разделить на две части.) Рис. 7.7. 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 (Выбрать неповторяюшиеся номера заказов из Детали заказов , где номер товара в номерах товаров велосипеды ) SELECT DISTINCT OrderNumber FROM Order Details 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 ts in the list of helmet product numbers (Выбрать неповторяющиеся номера заказов из Детали заказов , где номер товара в номерах товаров шлем ) SQL SELECT DISTINCT OrderNumber FROM Order.Details WHERE ProductNumber IN (10, 25, 26) Мы получим окончательное решение, если используем пересечение этих двух множеств. На рис. 7.8 представлена синтаксическая диаграмма SQL, которая решает эту задачу. (Обратите внимание: INTERSECT можно использовать несколько раз для объединения нескольких операторов SELECT.) ВыражвниФ SiliCT Опфрагор SBLBcr-INTERSf CT -i--ж-* Отратор SBLECT Рис. 7.8. Связывание двух операторов SELECT в INTERSECT Можно взять две части нашего запроса и связать их вместе в операторе INTERSECT, чтобы получить правильный ответ: SQL SELECT DISTINCT OrderNumber FROM Order Details WHERE ProductNumber IN (1, 2, 6, 11) INTERSECT SELECT DISTINCT OrderNumber FROM OrderDetails WHERE ProductNumber IN (10, 25, 26) Жаль, что мало коммерческих реализаций SQL пока еще поддерживают оператор INTERSECT. Однако не все потеряно! Вспомните, что первичный ключ таблицы уникальным образом идентифицирует каждую строку (не требуется совпадения по всем полям в строке - только по первичному ключу - для поиска уникальных строк, которые пересекаются .) В главе 8 мы покажем альтернативный метод (JOIN), который может решать этот тип проблем другим способом. Большинство коммерческих реализаций SQL поддерживают JOIN.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |