Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lec5.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
216.06 Кб
Скачать

Внешние соединения

В случае, если строка таблицы не удовлетворяет условию соединения, она не включается в результат запроса. Например, при эквисоединении таблиц s_emp и s_customer клиент Sweet Rock Sports в выходном списке отсутствует, так как не имеет торгового представителя.

Строки, не удовлетворяющие условию соединения могут быть включены в результат запроса, если в условии соединения используется оператор внешнего соединения “(+)”. Этот оператор указывается на той стороне условия соединения, где не хватает информации. Он имитирует создание одной или нескольких строк с неопределенным значением, к которым можно присоединить одну или несколько строк, содержащих необходимые данные.

Пример: Для каждой фирмы-клиента выбрать ее номер и наименование, а также номер и фамилию ее торгового представителя. В список необходимо включить даже тех клиентов, которые не имеют торгового представителя.

Мы хотим получить всех фирм-клиентов без исключения, но стороны таблицы s_emp нам может не хватить информации: в таблице s_customer есть фирма-клиент, для которой не найдется торгового представителя в таблице s_emp. Поэтому знак внешнего соединения ставится в предложении WHERE со стороны таблицы s_emp.

SELECT c.id, c.name, e.id, e.last_name

FROM s_customer c, s_emp e

WHERE c.sales_rep_id=e.id(+);

Результат:

ID NAME ID LAST_NAME

--------- -------------------------- ---- ---------------

201 Unisports 12 Giljum

202 OJ Atheletics 14 Nguyen

203 Delhi Sports 14 Nguyen

204 Womansport 11 Magee

205 Kam's Sporting Goods 15 Dumas

206 Sportique 15 Dumas

207 Sweet Rock Sports

208 Muench Sports 15 Dumas

209 Beisbol Si! 11 Magee

210 Futbol Sonora 12 Giljum

211 Kuhn's Sports 15 Dumas

212 Hamada Sport 13 Sedeghi

213 Big John's Sports Emporium 11 Magee

214 Ojibway Retail 11 Magee

215 Sporta Russia 15 Dumas

15 rows selected.

-- Теперь фирма Sweet Rock Sports попала в результат запроса. Так как она не -- имеет торгового представителя, в полях о торговом представителе выводятся -- пустые значения.

Символ внешнего соединения может использоваться на любой стороне условия в предложении WHERE, но не по обеим сторонам. Он указывается после имени таблицы, в которой нет соответствующих строк. Условия, предполагающие внешнее соединение, не могут включать оператор IN и быть связанными с другими условиями с помощью оператора OR.

Соединения таблицы с собой

С помощью псевдонимов можно представить таблицу, как две отдельных таблицы. Это позволяет соединять строки таблицы с ее же строками.

Пример: Найти пары сотрудников, принятых на работу в один и тот же день.

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

SELECT one.last_name, two.last_name, one.start_date

FROM s_emp one, s_emp two

WHERE one.start_date=two.start_date

AND one.id<>two.id;

Результат:

LAST_NAME LAST_NAME START_DA

------------ --------------- --------

Smith Ngao 08.03.90

Ngao Smith 08.03.90

Biri Quick-To-See 07.04.90

Quick-To-See Biri 07.04.90

Magee Menchu 14.05.90

Menchu Magee 14.05.90

1 Если Вы хотите проверить на практике действие команды из примера, таблицу goods можно создать и заполнить следующей последовательностью команд:

CREATE TABLE goods (name VARCHAR2(15), cost NUMBER(5));

INSERT INTO goods VALUES('TV', 2000);

INSERT INTO goods VALUES('Kettle', 500);

INSERT INTO goods VALUES('Refrigerator', 1500);

10

Л екция. Язык SQL. Групповые функции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]