пятница, 5 июля 2013 г.

Самообъединения

Рубрика: Базы Данных

И снова продолжаю рассказывать про базы данных, про объединения. На выходных я не сумею статьи публиковать (доступа к компьютерам не будет), так что максимум — в воскресенье вечером про хабр заметку кину сюда. Но в понедельник — точно все будет.

Самообъединения нужны тогда, когда в одной и той же таблице хранятся разные данные, например – таблица со служащими и их руководителями (руководитель – тоже служащий), пример популярный, его я и буду сейчас разбирать. Вот такая таблица у меня получилась:

ID
FIO
IDRUK
1
Иванов И.И.

2
Петров С.П.

3
Курчатов Е.Н.

4
Новиков Р.С.
1
5
Жиглов Н.Н.
1
6
Ололоев Е.Е.
2
7
Петрова И.Е.
3
8
Няшкина С.А.
1
9
Лагуна О.Н.
3
10
Лалалаевина Н.Е.
2

Очень простая таблица. Теперь надо получить список сотрудников и их руководителей. В данном примере надо вывести ФИО сотрудника и ФИО руководителей, если сам сотрудник – руководитель – ничего выводить не надо. Для этого нужно произвести самообъединение таблицы: 

SELECT * FROM tablerab r1, tablerab R2 WHERE r1.idruk = r2.id 

Вот и получаем нужный результат (а еще можно быстро отобрать ФИО руководителей, нужно поставить IDRUK IS NULL, тогда выдаст список руководителей):

ID
FIO
IDRUK
ID
FIO
IDRUK
8
Няшкина С.А.
1
1
Иванов И.И.

5
Жиглов Н.Н.
1
1
Иванов И.И.

4
Новиков Р.С.
1
1
Иванов И.И.

10
Лалалаевина Н.Е.
2
2
Петров С.П.

6
Ололоев Е.Е.
2
2
Петров С.П.

9
Лагуна О.Н.
3
3
Курчатов Е.Н.

7
Петрова И.Е.
3
3
Курчатов Е.Н.


Внешние самообъединения: 

Но что если надо вывести всех сотрудников (даже руководителей) и у них указать ФИО их руководителей (а если нет руководителя – то сделать об этом приписку)? Да очень просто, воспользоваться уже рассмотренным внешним объединением (+). Главное плюс в правильном месте поставить. Я еще в запрос NVL вставил, чтобы покрасивее был результат: 

SELECT r1.fio, NVL(r2.fio, 'Руководитель') ruk FROM tablerab r1, tablerab R2 WHERE r1.idruk = r2.id(+) 

С NVL я вас когда-нибудь в следующий раз познакомлю. А пока – у меня получился следующий результат после выполнения данного запроса:

FIO
RUK
Няшкина С.А.
Иванов И.И.
Жиглов Н.Н.
Иванов И.И.
Новиков Р.С.
Иванов И.И.
Лалалаевина Н.Е.
Петров С.П.
Ололоев Е.Е.
Петров С.П.
Лагуна О.Н.
Курчатов Е.Н.
Петрова И.Е.
Курчатов Е.Н.
Курчатов Е.Н.
Руководитель
Петров С.П.
Руководитель
Иванов И.И.
Руководитель

К внутренним объединениям можно применять ранее рассмотренные объединения по равенству и не по равенству. На этом, пожалуй, все. В дальнейшем выберу тему посложнее, чем объединения. Но и она была для меня полезной – вспомнил правильные названия всем этим процессам. 

Комментариев нет:

Отправить комментарий