Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
17.04.2018
Размер:
164.35 Кб
Скачать

Многотабличные запросы

Используя созданные связи между таблицами, можно соединять содержащуюся в них информацию с помощью многотабличных запросов. Описывая в операторе SELECT связь "главный/подчиненный" с помощью сравнения значений первичного и внешнего ключей, разработчик сообщает СУБД Oracle, как нужно связывать информацию из главной таблицы с информацией из подчиненной таблицы.

Например, список покупок с полными именами продавцов можно получить, использовав следующую команду:

SELECT purchase.product_name,

person.last_name,

person.first_name,

purchase.quantity

FROM purchase, person

WHERE person.person_code = purchase.salesperson

Написание команды, которая комбинирует данные из более чем одной таблицы в единый список, называется созданием соединения (join). Самое важное, что нужно помнить о соединении, заключается в следующем: нужно включать в оператор SELECT предложение WHERE, описывающее, как связаны друг с другом первичный ключ главной таблицы и внешний ключ подчиненной таблицы. Если этого не сделать, Oracle соединит каждую запись главной таблицы с каждой записью подчиненной таблицы, результатом чего может стать очень и очень длинный список.

Чтобы увидеть, к чему приводит создание соединения без предложения WHERE, можно выполнить следующую команду:

SELECT purchase.product_name,

person.last_name,

person.first_name,

purchase.quantity

FROM purchase, person ;

Для пяти записей в таблице PERSON и семи записей в таблице PURCHASE соединение даст 35 строк совершенно бесполезных данных. Результат такого типа, созданный путем выдачи команды соединения без предложения WHERE, называется декартовым произведением.

В одном операторе SELECT можно соединять записи из многих разных таблиц. Для этого достаточно: (а) установить между таблицами логические связи первичного/внешнего ключа, и (б) определить каждую из этих связей в предложении WHERE оператора SELECT.

В качестве примера предположим, что нужно получить список всех покупок с ценами купленных товаров и фамилиями продавцов. Эта информация находится в трех разных таблицах. Код, выполняющий это соединение, выглядит следующим образом:

SELECT purchase.product_name,

product.product_price,

purchase.quantity,

person.last_name

FROM product,

person,

purchase

WHERE product.product_name = purchase.product_name

and

person.person_code = purchase.salesperson

Можно присвоить каждой таблице короткий псевдоним (alias) и использовать его для ссылок на таблицу в пределах команды. Псевдоним таблицы определяется сразу после ее имени в разделе FROM.

Чтобы нажимать еще меньше клавиш, можно опустить имена таблиц для тех столбцов, имена которых уникальны среди таблиц, используемых для выборки. Иными словами, если Oracle может посмотреть на имя столбца и определить, что оно существует только в одной из таблиц, то не нужно указывать, в какой таблице находится этот столбец. Однако не рекомендуется использовать такое упрощение в соединениях по двум причинам: во-первых, оно несколько замедляет обработку (поскольку Oracle должен заглянуть во все таблицы, прежде чем определить, что столбец находится только в одной из них), а во-вторых, затрудняет чтение команды.

Соседние файлы в папке лекции оракл