русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Иерархические запросы.


Дата добавления: 2015-08-31; просмотров: 751; Нарушение авторских прав


С помощью директивы connect by таблица соединяется сама с собой несколько раз по заданному условию, пока это возможно.

Подробности мы разберем в задачах ниже.

Задача. Вывод иерархии с отступами.

Создать таблицу иерархии государственных служащих KK_MKB(ID - код служащего, NAME - должность служащего, BOSS_ID - код непосредственного начальника).

Написать запрос, выдающий список сотрудников как оглавление книги (босс, а под ним его сотрудники).

Перед сотрудником следует поставить столько пробелов, сколько уровней ему осталось до вершины иерархии. Например,

Президент

Премьер-министр

Вице-премьер деловой

Министр сельского хозяйства

Министр финансов

Министр экономического развития

Вице-премьер силовой

Министр внутренних дел

Министр обороны

Генерал

Капитан

Спикер

Вице-спикер1

Вице-спикер2

 

Создадим таблицу и заполним ее данными:

CREATE TABLE KK_MKB(ID INTEGER, NAME VARCHAR2(50), BOSS_ID INTEGER);

insert into KK_MKB(ID, NAME, BOSS_ID) values (1,'Президент',null);

insert into KK_MKB(ID, NAME, BOSS_ID) values (2,'Премьер-министр',1);

insert into KK_MKB(ID, NAME, BOSS_ID) values (3,'Спикер',1);

insert into KK_MKB(ID, NAME, BOSS_ID) values (4,'Вице-премьер деловой',2);

insert into KK_MKB(ID, NAME, BOSS_ID) values (5,'Вице-премьер силовой',2);

insert into KK_MKB(ID, NAME, BOSS_ID) values (6,'Вице-спикер1',3);

insert into KK_MKB(ID, NAME, BOSS_ID) values (7,'Вице-спикер2',3);

insert into KK_MKB(ID, NAME, BOSS_ID) values (8,'Министр сельского хозяйства',4);

insert into KK_MKB(ID, NAME, BOSS_ID) values (9,'Министр финансов',4);

insert into KK_MKB(ID, NAME, BOSS_ID) values (10,'Министр экономического развития',4);

insert into KK_MKB(ID, NAME, BOSS_ID) values (11,'Министр внутренних дел',5);



insert into KK_MKB(ID, NAME, BOSS_ID) values (12,'Министр обороны',5);

insert into KK_MKB(ID, NAME, BOSS_ID) values (13,'Генерал',12);

insert into KK_MKB(ID, NAME, BOSS_ID) values (14,'Капитан',13);

 

Напишем иерархический запрос, решающий задачу:

select id, name, boss_id, level, substr(lpad(' ', level) || name, 2)

from KK_MKB

connect by prior id = boss_id

start with boss_id is null;

 

Внесем зацикливание в данные, нарушив структуру дерева. Подчиним Премьер-министра еще и капитану:

insert into KK_MKB(ID, NAME, BOSS_ID) values (2,'Премьер-министр',14);

 

Теперь для "раскручивания дерева" добавим опцию nocycle, иначе запрос выругается:

select id, name, boss_id, level, substr(lpad(' ', level) || name, 2)

from KK_MKB

connect by nocycle prior id = boss_id

start with boss_id is null;

 

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

 

А с использованием конструкции "and prior dbms_random.value is not null" можно крутить иерархию бесконечно:

select id, name, boss_id, level, substr(lpad(' ', level) || name, 2)

from KK_MKB

connect by prior id = boss_id

and prior dbms_random.value is not null

start with boss_id is null;



<== предыдущая лекция | следующая лекция ==>
Случайные значения имен, регионов и паспортов клиентов можно брать с помощью конструкции dbms_random.string. | Создать иерархическую таблицу сотрудников, а также таблицу с хобби этих сотрудников. Создать отчет об иерархии сотрудников с отступами с указанием хобби.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.105 сек.