|
Программирование >> Исключение дубликатов строк
Здесь можно заменить оператор SELECT, который возвращает одну строку из двух столбцов - строковый подзапрос,- второй частью сравнения. Большинство коммерческих баз данных не поддерживает ни конструктор строкового значения, ни строковые подзапросы. Табличные подзапросы Табличные подзапросы уже широко использовались в предыдущих главах для определения сложного результата, который затем вкладывался в условие FROM другого запроса. В данной главе будет показано, как использовать табличные подзапросы в качестве источника списка значений для сравнения предиката IN. Мы также изучим несколько новых ключевых слов предиката сравнения, которые используются только в табличных подзапросах. Скалярные подзапросы Скалярный подзапрос используется в тех местах, где иначе требуется типизированное выражение. Он позволяет извлечь отдельный столбец или вычислить выражение из другой таблицы, которая не обязательно должна присутствовать в условии FROM основного запроса. Можно использовать отдельное значение, извлеченное скалярным подзапросом в списке столбцов, запрошенных в условии SELECT, или как значение для сравнения в условии WHERE. Подзопросы кок вырожвния со столбцоми Из главы 5 вы узнали об использовании выражений для формирования вычисляемых столбцов, которые должны выводиться запросом. Можно также использовать специальный тип оператора SELECT - подзапрос - для извлечения данных из другой таблицы, даже если эта таблица отсутствует в условии FROM. Синтаксис Вернемся к основам и рассмотрим простую форму оператора SELECT, показанного на рис. 11.1. Оператор SELBCT о- select *--jp* Типизированное выражение -f--ц -- псевдоним FROM -г- Ссылка на таблицу Рис. 11.1. Простой оператор SELECT Ткпшировашоф выражение Литеральное значение Ссылка на стоАбец Функция (Выражение SELECT) (Типизированное выражение) Типизированное выражение -
Рис. 11.2. JluazpaMMa для типизированного выражения Это выглядит просто, но в действительности все не так! На самом деле типизированное выражение может быть достаточно сложным. На рис. 11.2 показаны все опции, которые могут составлять типизированное выражение. Мы уже объясняли, как создать базовое типизированное выражение, используя значения типа литерал , ссылки на столбцы и функции (см. главу 5). Обратите внимание, что теперь в списке появилось выражение SELECT. Это означает, что скалярный подзапрос можно вложить в список выражений сразу же после ключевого слова SELECT. Скалярный подзапрос является выражением SELECT, которое возвращает только один столбец и не более одной строки. Это имеет смысл, потому что осуществляется замена подзапроса, где обычно вводится имя отдельного столбца или выражения, дающего в результате один столбец. Возможно, вы спросите, какая же от этого польза. Испбльзование подзапроса таким способом позволяет выдернуть отдельное значение из некоторой другой таблицы или запроса, чтобы включить его в вывод для своего запроса. Таблица или запрос, которые являются источником данных в условии FROM подзапроса, совсем не требуют своего указания в условии FROM внешнего запроса. В большинстве случаев потребуется добавить критерий в условие WHERE подзапроса, чтобы гарантировать возвращение не более чем одной строки. Можно даже иметь критерий в подзапросе, указывающий значение, возвращаемое внешним запросом, чтобы выбрать данные, имеющие отношение к текущей строке. Ознакомимся с некоторыми простыми примерами, используя только таблицы Customers и Orders из учебной базы данных заказов. На рис. 11.3 показана связь Me>fyiy этими двумя таблицами.
> >- Orders OrderNumber PK OrderDate ShipDate CustomerlD PK EmptoyeelD FK Рис. 11.3. Таблицы Customers и Orders Теперь построим запрос, который выдает список заказов для конкретной даты и выбирает фамилию соответствующего клиента из таблицы Customers, используя подзапрос. Внимание! В данной главе будет использоваться метод Запрос/Преобразование/Уточнение/SQL , введенный в главе 4. Кроме того, части, которые являются подзапросами, на шаге Уточнение заключаются в скобки и, там где это возможно, подзапросы выделяются отступом, чтобы привлечь внимание к тому, как они используются. Show те all the orders shipped on December 24, 1999 and the related customer last name . ( Показать все заказы, отгруженные на 24 декабря 1999 г., и фамилии соответствующих клиентов .) Преобразование: Select order number, order date, shipped date, and also select the related customer last name out of the customers table from the orders table where shipped date is December 24, 1999 (Выбрать номер заказа, дату заказа, дату отгрузки, а также фамилию соответствующего клиента из таблицы Клиенты из таблицы Заказы , где дата отгрузки - 24 декабря 1999) Уточнение: Select order number, order date, shipped date, and also (select the related customer last name out of the from customers table from the orders table) where shipped date = December 24, 1999 (Выбрать номер заказа, дату заказа, дату отгрузки (выбрать фамилию клиента из Клиенты из таблицы Заказы ), где дата отгрузки = 24 декабря 1999) SQL SELECT Orders.OrderNumber, Orders.OrderDate, Orders.ShippedDate, (SELECT Customers.CustLastName FROM Customers WHERE Customers.CustomerlD = Orders.CustomerlD) FROM Orders WHERE Orders.ShippedDate = 1999-12-24 Нам потребовалось ограничить значение идентификатора клиента (Customer ID) в подзапросе значением идентификатора клиента в каждой строке, извлекаемой из таблицы Orders. В ином случае в подзапросе будут получены все строки из
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |