Рубрика:
Базы Данных
И снова
продолжаю рассказывать про базы данных,
про объединения. На выходных я не сумею
статьи публиковать (доступа к компьютерам
не будет), так что максимум — в воскресенье
вечером про хабр заметку кину сюда. Но
в понедельник — точно все будет.
Самообъединения
нужны тогда, когда в одной и той же
таблице хранятся разные данные, например
– таблица со служащими и их руководителями
(руководитель – тоже служащий), пример
популярный, его я и буду сейчас разбирать.
Вот такая таблица у меня получилась:
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
|
Няшкина С.А.
|
Иванов И.И.
|
Жиглов Н.Н.
|
Иванов И.И.
|
Новиков Р.С.
|
Иванов И.И.
|
Лалалаевина Н.Е.
|
Петров С.П.
|
Ололоев Е.Е.
|
Петров С.П.
|
Лагуна О.Н.
|
Курчатов Е.Н.
|
Петрова И.Е.
|
Курчатов Е.Н.
|
Курчатов Е.Н.
|
Руководитель
|
Петров С.П.
|
Руководитель
|
Иванов И.И.
|
Руководитель
|
Комментариев нет:
Отправить комментарий