В стиле SQL - 6 (иерархии)
Dec. 8th, 2014 01:47 amИерархии традиционно вызывают много вопросов. Обычно довольно простых, например, связанных с порядком выполнения частей запроса, особенно когда иерархия строится над несколькими таблицами. Но встречаются задачи и поинтереснее.
Предметная область состоит из сотрудников, каждый из которых работает в некотором отделе. Отделы образуют оргструктуру, то есть иерархию. Некоторым (но не всем) отделам приписан адрес.
1 <-- адрес A / \ 2 3 <-- адрес B / \ 4 5 <-- адрес C
Чтобы найти расположение отдела, у которого нет своего адреса, надо пройтись вверх по иерархии до тех пор, пока не будет обнаружен вышестоящий отдел с адресом.
Например, для картинки выше, адреса отделов должны быть такими:
DEP_ID ADDRESS ------ ------- 1 A 2 A 3 B 4 B 5 C
Задача состоит в написании запроса, который выведет всех сотрудников с указанием их отделов и адресов.
Вот тестовые данные.
( Поехали )create table dep( id number primary key, address varchar2(1000) ); create table dep_hier( parent_id references dep(id), child_id references dep(id) ); create table emp( id number primary key, dep_id number references dep(id) ); insert into dep values(1, 'A'); insert into dep values(2, ''); insert into dep values(3, 'B'); insert into dep values(4, ''); insert into dep values(5, 'C'); insert into dep_hier values(1, 2); insert into dep_hier values(1, 3); insert into dep_hier values(3, 4); insert into dep_hier values(3, 5); insert into emp values(101, 1); insert into emp values(102, 2); insert into emp values(103, 3); insert into emp values(104, 4); insert into emp values(105, 5); commit;