| Каталог | Индекс раздела |
| Назад | Оглавление | Вперед |
Наиболее распространенный способ соединения таблиц - эквисоединение, указание в фразе WHERE условия равенства значений в столбцах. Такое соединение (как соединение по равенству значений, так и соединение по любому произвольному условию) дает результирующую таблицу, в которой каждая строка одной таблице комбинируется со строкой другой таблице, и для результирующей строки условие соединения является истинным. Такое соединение называется внутренним. При внутреннем соединении двух таблиц в выходное множество строк попадают данные только из тех строк первой таблицы, которым есть соответствие во второй таблице, и наоборот. В реальных системах могут возникать задачи, в которых требуется включение информации, не имеющей соответствия. Соединения такого вида называются внешними.
Внешнее соединение включает в себя внутреннее соединение, а также некоторые строки, отсутствующие в результате внутреннего соединения. Типы внешних соединений:
Для строк, которым нет соответствия в другой таблице, значения тех столбцов результата, которые должны выбираться из другой таблицы, устанавливаются неопределенными.
Рассмотрим внешние соединения на упрощенном примере. Пусть у нас есть две таблицы.
Таблица отделов - dep - с таким содержимым:
dep_id name
------ -------
12 SALES
13 OPERATIONS
14 RESEACH
Таблица менеджеров отделов - mng - с таким содержимым:
m_name dep_id
------- --------
JONES 12
SMITH 13
BROWN 15
Рассмотрим следующие выборки из этих таблиц.
1). Выбрать названия отделов и имена их менеджеров - естественное (внутреннее) соединение
name m_name
------- -------
SALES JONES
OPERATIONS SMITH
2). Выбрать названия отделов и имена их менеджеров, включая те отделы, в которых нет менеджеров, - левое внешнее соединение
name m_name
------- -------
SALES JONES
OPERATIONS SMITH
RESEACH -
3). Выбрать названия отделов и имена их менеджеров, включая тех менеджеров, которые не приписаны к отделам,- правое внешнее соединение
name m_name
------- -------
SALES JONES
OPERATIONS SMITH
- BROWN
4). Выбрать названия отделов и имена их менеджеров, включая те отделы, в которых нет менеджеров, и тех менеджеров, которые не приписаны к отделам - полное внешнее соединение
name m_name
------- -------
SALES JONES
OPERATIONS SMITH
RESEACH -
- BROWN
Внешние соединения реализуются в рассматриваемых нами СУБД совершенно различными способами.
В DB2 возможность внешних соединений включена в операцию Ключевые словосочетания: 2).
3).
4). Простого решения для полного внешнего соединения нет, его можно получить объединением левого и правого внешних соединений:
3.4.2 Внешние соединения в DB2
JOIN, полный синтаксис которой показан на рис.3.21.

Рисунок 3.21 - Полный синтаксис операции JOIN DB2
INNER (принимается по умолчанию), LEFT OUTER, RIGHT OUTER и FULL OUTER означают соответственно внутреннее, левое внешнее, правое внешнее и полное внешнее соединения. Реализации запросов, приведенных в п.3.4.1, для DB2 будут иметь вид:
1).
SELECT name, m_name
FROM dep JOIN mng
ON dep.dep_id= mng.dep_id
SELECT name, m_name
FROM dep LEFT OUTER JOIN mng
ON dep.dep_id= mng.dep_id
SELECT name, m_name
FROM dep RIGHT OUTER JOIN mng
ON dep.dep_id= mng.dep_id
4).
SELECT name, m_name
FROM dep FULL OUTER JOIN mng
ON dep.dep_id= mng.dep_id
3.4.3 Внешние соединения в Oracle
В Oracle внешнее соединение реализуется специальной операцией - операцией (+). Эта операция применяется к столбцу той таблицы, которая дополняет строку пустыми значениями.
Ограничения на применение операции следующие:
Реализации запросов п.3.4.1 в Oracle будут иметь вид:
1).
(+) можно применять только к столбцу, а не к выражению; если столбец участвует в выражении, (+) ставится при столбце;
(+), не могут комбинироваться с помощью операции OR;
SELECT name, m_name
FROM dep, mng
WHERE dep.dep_id=mng.dep_id
2).
SELECT name, m_name
FROM dep, mng
WHERE dep.dep_id=mng.dep_id(+)
3).
SELECT name, m_name
FROM dep, mng
WHERE dep.dep_id(+)=mng.dep_id
SELECT name, m_name
FROM dep, mng
WHERE dep.dep_id=mng.dep_id(+)
UNION
SELECT name, m_name
FROM dep, mng
WHERE dep.dep_id(+)=mng.dep_id
| Назад | Оглавление | Вперед |
| Каталог | Индекс раздела |