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

1 ... 108 109 110 [ 111 ] 112 113 114 ... 152


ГО-*: 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

Orders

4- * * 4- it- 4- < к < 4 f

OrderNumber

OrderDate

ShipDate

CustomerlD

EmployeelD

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.



1 ... 108 109 110 [ 111 ] 112 113 114 ... 152

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