КаталогИндекс раздела
НазадОглавлениеВперед


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

3.4.1 Определение внешних соединений

Наиболее распространенный способ соединения таблиц - эквисоединение, указание в фразе 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

Внешние соединения реализуются в рассматриваемых нами СУБД совершенно различными способами.

3.4.2 Внешние соединения в DB2

В 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

2).

    SELECT name, m_name 
      FROM dep LEFT OUTER JOIN mng 
        ON dep.dep_id= mng.dep_id

3).

    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).
    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

4). Простого решения для полного внешнего соединения нет, его можно получить объединением левого и правого внешних соединений:

    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

НазадОглавлениеВперед
КаталогИндекс раздела