|
Программирование >> Исключение дубликатов строк
ГО-*: SEtECT -Типтироваиное выражение псевдоним iiiiiii-ii-fci пял iij(i. i:iiiliiiiWiiiiii!ii!Viiiitjfiiiwliiti i iiii>iiiiiriiiij iHjiiMiii FROM Ссылка HO табАмцу iwl!H :*i!iji*-HW!iii(!iii!Vi in tJIliliill.mii! ii4 ; wiiwWwjii>j Hiipiwi I WHERE имястолбцо i!i( iri!MiH!H д1 -Типизированное выражение SOME -ANY - Рис. 11.5. Фильтрация результата с использованием простого предиката сравнения и не более одной строки. Решим простую задачу, требующую сравнения со значением, возвращенным из подзапроса. В этом примере предполагается запросить все детали каждого На рис. 11.6 показаны необходимые для этого таблицы. Customers CustomerfD РК CustFirstName CustLastName CustStreetAddress CustCity CustState CustZipCode CustPhoneNumber
OrderDetails >. ! > V : *: >:*:**:>>> * * . * * OrderNumber CPK ProductNumber CPK QuotedPrice QuarlityOrdered Products ProductNumber PK ProductName ProductDescription RetailPrice QuantityOnHand CategorylD FK KlI.-IWHiwHWi.i.a! Рис. 11.6. Таблицы, необходимые для подготовки списка всех подробностей о заказе List customers and all the details from their last order . ( Показать список клиентов и все детали их последнего заказа ,) Преобразование: Select customer first name, customer last name, order number, order date, product number, product name, and quantity ordered from the customers table joined with the orders table on customer ID, then joined with the order details table on order number, and then joined with the products table on product number where the order date equals the maximum order date from the orders table for this customer (Выбрать имя клиента, фамилию клиента, номер заказа, дату заказа, номер товара, наименование товара и заказанное количество из таблицы Клиенты , соединенной с таблицей Заказы по идентификатору клиента, затем соединенной с таблицей Детали заказа по номеру заказа, затем соединенной с таблицей Товары по номеру товара, где дата заказа равна максимальной дате заказа из таблицы Заказы для этого клиента) Уточнение: Select customer first name, customer last name, order number, order date, product number, product name, aftd quantity ordered from the customers table joined with the orders table on customer ID, thett joined with the order details table on order number, and then joined with the products table on product number where the order date equals = (Select the maxtfrmm (order date) from the orders table for this customer where orders.customerlD = customers.customerlD) (Выбрать имя клиента, фамилию клиента, номер заказа, дату заказа, номер товара, наименование товара, заказанное количество из Клиенты , соединенной с Заказы по идентификатору клиента, соединенной с Детали заказа по номеру заказа, соединенной с Товары по номеру товара где дата заказа = (Выбрать МАХ(дата заказа) из Заказы , где orders.customerlD - customers.customerlD)) SQL SELECT Customers.CustFirstName. Customers.CustLastName, Orders.OrderNumber, Orders.OrderDate, Order Details.ProductNumber, Products.ProductName, Order.Details.QuantityOrdered FROM ((Customers INNER JOIN Orders ON Customers.CustomerlD = Orders.CustomerlD) INNER JOIN Order.Details ON Orders.OrderlD = Orderjetails.OrderlD) INNER JOIN Products ON Products.ProductNumber * OrderDetails.ProductNumber WHERE Orders.OrderDate = (SELECT MAX(OrderDate) FROM Orders AS 02 WHERE 02.CustomerlD = Customers.CustomerlD) Заметили ли вы, что второй ссылке на таблицу Orders было присвоено имя-псевдоним (т. е. таблице Orders в подзапросе)? Даже если имя-псевдоним пропущено, многие системы БД распознают, что подразумевается копия таблицы Orders в подзапросе. Фактически стандарт SQL указывает, что любая неуточненная ссылка должна быть разрешена, начиная с самого внутреннего запроса. Тем не менее мы добавили псевдоним-ссылку с целью сделать совершенно понятным, что копия таблицы Orders, на которую мы ссылаемся в условии WHERE подзапроса, является той же таблицей, что и в условии FROM подзапроса. Если соблюдать эту практику, то будет намного легче понять запрос и вам самим, в случае возвраш,ения к нему несколько месяцев спустя, и кому-либо другому. Специальные ключевые слово предикого длп подзопросов Стандарт SQL определяет несколько специальных ключевых слов предиката для использования в условии WHERE с подзапросом. Принадлежность к множеству - IN Ключевое слово IN используется в условии WHERE для сравнения столбца или выражения со списком значений. Каждое типизированное выражение в списке IN может быть скалярным подзапросом. А как насчет использования подзапроса для формирования всего списка? Как показано на рис. 11.7, это вполне можно сделать. В этом случае можно использовать табличный подзапрос, который возвращает один столбец и столько строк, сколько необходимо для построения списка. Воспользуемся, например, базой данных Recipes (Рецепты). На рис. 11.8 показаны вовлеченные в это таблицы. Предположим, что к обеду вы пригласили кого-то, кто обожает блюда из морепродуктов. Хотя у вас есть множество рецептов, включающих компоненты даров моря, вы не уверены в названиях всех компонентов в вашей базе данных. Вам точно известно, что в IngredientCiassDescription имеются Seafood (Морепродукты), поэтому можно соединить все таблицы вместе и отфильтровать по IngredientCiassDescription, или можно подойти творчески и воспользоваться вместо этого подзапросом и предикатом IN.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.063
При копировании материалов приветствуются ссылки. |