|
Программирование >> Исключение дубликатов строк
Существование - 6XISTS Как принадлежность к множеству (IN), так и количественно определенные предикаты (SOME/ANY/ALL) выполняют сравнение с типизированным выражением - дбычно это столбец из источника, определенного в условии FROM внешнего запроса. Иногда полезно просто знать, что интересуюш,ая строка EXISTS (существует) в наборе результатов, возвращенном подзапросом. В главе 8 показана методика решения задач AND с использованием сложных операторов INNER JOIN. EXISTS также можно использовать для решения задач подобного типа. Рассмотрим еще раз задачу, решенную в главе 8. Find all the customers who ordered a bicycle and who also ordered a helmet , ( Найти всех клиентов, заказавших велосипед и также заказавших шлем .) Преобразование: Select customer ID, customer first name, and customer last name from the customer table where there exists some row from the orders table joined with the order details table on order ID, and then joined with the products table on product ID where product name contains Bike and the orders table customer ID equals the customers table customer ID, and there also exists some row from the orders table joined with the order details table on order ID, and then joined with the products table on product ID where product name contains Helmet and the orders table customer ID equals the customers table customer ID (Выбрать идентификатор клиента, имя клиента и фамилию клиента из таблицы Клиент , в которой существует несколько строк из таблицы Заказы , соединенной с таблицей Детали заказа по идентификатору заказа, а затем соединенной с таблицей Товары по идентификатору товара, где наименование товара содержит Bike и идентификатор клиента таблицы Заказы равен идентификатору клиента таблицы Клиенты , а также существует несколько строк из таблицы Заказы , соединенной с таблицей Детали Уточнение: заказа по идентификатору заказа, а затем соединенной с таблицей Товары по идентфикатору товара, где наименование товара содержит Helmet и идентификатор клиента таблицы Заказы равен идентификатору клиента таблицы Клиенты ) Select customer ID, customer first name, ttne customer last name from the customers table where tttere exists some row (SELECT * from the orders table joined with the order details table on order ID, and then joined with the products table on product ID where product name contains LIKE **Bike and the orders table customer ID equals = the customers table customer ID), and there also exists some row (SELECT * from the orders table joined with the order details table on order ID, and then joined with the products table on product ID where product name contains LIKE Helmet and the orders table customer ID equals = the customers table customer ID) (Выбрать идентификатор клиента, имя клиента, фамилию клиента из Клиент , в которой существуют (Выбрать * из Заказы , соединенной с Детали заказа по идентификатору заказа, соединенной с Товары по идентификатору товара, где наименование товара LIKE Bike и идентификатор клиента Заказы == идентификатору клиента Клиенты ), и существует (Выбрать * из Заказы , соединенной с Детали заказа по идентификатору заказа, соединенной с Товары по идентификатору товара, где наименование товара LIKE Helmet и идентификатор клиента Заказы = идентификатору клиента Клиенту )) SELECT Customers.CustomerlD, Customers.CustFirstName, Customers.CustLastName FROM Customers WHERE EXISTS (SELECT * FROM (Orders INNER JOIN Order.Details ON Orders.OrderNumber = Order.Details,OrderNumber) INNER JOIN Products ON Products.ProductNumber Order.Detalls.ProductNumber WHERE Products.ProductName Like XHelmef AND Orders.CustomerlD = Customers.CustomerlD) AND EXISTS (SELECT * FROM (Orders ItiNER JOIN Order.Details ON Orders.OrderNumber = Order.Details.OrderNumber) INNER JOIN Products Глйвд и * Пйдзапросьг 347 ОМ Products.ProductNumber = OrderDetails.ProductNumber WHERE Products.ProductName Like XBlke AND Orders.CustomerXP = Customers.customerlD) Обратите внимание, что можуо использовать любое имя столбца из любой таблицы в условии FROM, как столбца, извлекаемого в условии SELECT подзапроса. Для всех столбцов выбрано использование краткого обозначения * . Этот запрос можно представить по-другому, как Указать клиентов, для которых существует несколько строк в деталях заказов на велосипеды и также существует несколько строк в деталях заказа на шлемы . Поскольку идентификатор заказа не сопоставляется, можно не беспокоиться о том, что клиент заказал велосипед в одном заказе, а шлем в другом. Внимание! Это настолько интересный запрос, что его решение сохранено как Cust Bikes And Helmets EXISTS в учебной базе данных. Исходное решение с INNER JOIN можно найти под именем Cust Bike And Helmets JOIN . Использование подзапросов На этот момент вы уже должны достаточно хорошо понимать концепцию использования подзапроса как для генерации выходных столбцов, так и для выполнения сложного сравнения в условии WHERE. Для лучшего представления о широких возможностях использования подзапросов мы покажем задачи, которые можно решить с их помощью. Выроженип из столбцов Использование подзапроса ддя извлечения отдельного значения из связанной таблицы можно более эффективно выполнять в JOIN. Однако при рассмотрении обобщенных функций подзапросы для извлечения результатов вычислений функций делают эту мысль намного более интересной. Использование обобщенных функций мы рассмотрим в следующей главе, а пока - вот некоторые задачи, которые можно решить, используя подзапрос для формирования столбца вывода. Привести список поставщиков и подсчитайте товары, проданные ими нам**, Вывести на экран товары и самую последнюю дату заказа товара . Показать эстрадных артистов и подсчитать количество ангажементов у каждого из них . Показать каждого клиента и дату последней заявки, зарегистрированной им
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |