Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по бд.doc
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
4.79 Mб
Скачать

Рекурсивное связывание

Рекурсивное связывание (SELF JOIN) предполагает связывание таблицы с ней же самой, как будто бы это были две таблицы, применяя временное переименование таблицы в операторе SQL. Синтаксис такого оператора следующий.

SELECT А.имя_столбца, В.имя_столбца [, С.имя_столбца ] 

FROM таблица1 А, таблица2 В [, таблица3 С ] 

WHERE А.имя_столбца = В.имя_столбца  [ AND А.имя_столбца = С.имя_столбца ]

Например,

SELECT A.LAST_NAME, B.LAST_NAME, A.FIRST_NAME 

FROM EMPLOYEE_TBL A,  EMPLOYEE_TBL В 

WHERE A.LAST_NAME = B.LAST_NAME;

Этот оператор SQL возвратит имена всех служащих с одинаковыми фамилиями из таблицы EMPLOYEE_TBL. Рекурсивное связывание удобно использовать, когда все необходимые данные размещаются в одной таблице, но требуется каким-то образом сравнить одни записи таблицы с другими.

Часто использование рекурсивного связывания объясняется на следующем примере. Предположим, что имеется таблица, в которой хранятся табельный номер, имя служащего и табельный номер менеджера этого служащего, и предположим, что возникла необходимость получить список служащих вместе с именами их менеджеров. Проблема в том, что столбца с именами менеджеров в данной таблице нет – имеется только столбец с именами всех служащих.

SELECT ID, NAME, MNGR_ID FROM EMP;

1 JOHN 0

2 MARY 1

3 STEVE 1

4 JACK 2

5 SUE 2

Поэтому в следующем запросе таблица EMP в выражении ключевого слова FROM включена дважды и ей назначены два псевдонима. Имея два псевдонима, таблицу можно рассматривать как две разные таблицы. Все менеджеры являются также служащими, поэтому в условии связывания можно сравнить табельный номер служащего из «первой» таблицы с табельным номером менеджера из «второй» таблицы. Теперь «первая» таблица хранит информацию о служащих, а «вторая» – о менеджерах.

SELECT El.NAME, E2.NAME  FROM EMP El, EMP E2  WHERE E1.MGR_ID = E2.ID;

NAME NAME

MARY JOHN

STEVE JOHN

JACK MARY

SUE MARY

Связывание по нескольким ключам

В большинстве случаев связывание таблиц осуществляется по одному ключевому полю одной таблицы и одному ключевому полю другой. Но в зависимости от структуры базы данных для вас может оказаться возможным связать таблицы и по нескольким ключам. В таблице может иметься ключ, составленный из значений не одного, а нескольких столбцов. Точно так же из нескольких столбцов может состоять и внешний ключ.

Рассмотрим следующие таблицы.

PROD:

SERIAL_NUMBER NOT NULL NUMBER(10)

VENDOR_NUMBER NOT NULL NUMBER(10)

PRODUCT_NAME NOT NULL VARCHAR2(10)

COST NOT NULL NUMBER (8, 2)

ORD:

ORD_NO NOT NULL NUMBER(10)

SERIAL_NUMBER NOT NULL NUMBER(10)

VENDOR_MUMBER NOT NULL NUMBER(10)

QUANTITY NOT NULL NUMBER(5)

ORD_DATE NOT NULL DATE

Ключом в таблице PROD является комбинация столбцов SERIAL_NUMBER и VENDOR_NUMBER Вероятно, в данной торговой компании некоторые товары имеют один серийный номер, но различаются по коду производителя.

Внешним ключом в таблице ORD тоже является комбинация столбцов

SERIAL_NUMBER И VENDOR_NUMBER.

При выборе данных из обеих таблиц (PROD и ORD) оператор связывания может выглядеть следующим образом:

SELECT Р.PRODUCT_NAME, O.ORD_DATE, О.QUANTITY 

FROM PROD P, ORD О

WHERE P.SERIAL_NUMBER = O.SERIAL_NUMBER AND P.VENDOR_NUMBER = О.VENDOR_NUMBER;