Oracle 11g CREATE VIEW с использованием CONNECT BY и нескольких таблиц

Используя базу данных Oracle 11G (, а не R2), нам необходимо создавать отчеты, которые показывают, к какому Руководящему комитету принадлежит структура отчетности отдельного лица.

На высоком уровне мы определяем присутствие человека в совете директоров, находя идентификатор сотрудника в таблице board_members.

В таблице board_members есть идентификатор позиции, который можно использовать для доступа к позициям в board_и исходя из этого мы можем определить, находится ли эта позиция в руководящем комитете. (Примеры ниже.)

Для любого сотрудника, входящего в руководящий комитет, его собственное удостоверение личности будет представлять BOARD_LEAD.

Для любого другого сотрудника отчет_to value рекурсивно повторяется до тех пор, пока не будет определен член Руководящего комитета, и идентификатор этого человека будет BOARD_LEAD.

Сотрудники нашего высшего-уровня сообщают_,чтобы они равнялись их собственным_идентификаторам, а не более-обычному NULL.

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

Я пытаюсь понять, как создать ПРОСМОТР, который будет предоставлять такую ​​информацию для Эквивалентности полной занятости и других потребностей отчетности. Я убежден, что CONNECT BY будет задействован, но я нахожу документацию Oracle запутанной, и я не нашел примеров, которые включали бы несколько таблиц, таких как эта. (Боюсь, что этому недостатку примера есть веская причина.)

Можно ли вообще написать такое представление на Oracle 11g (не R2), а не промежуточную таблицу, которая должна обновляться при каждом изменении позиции?

Create table board_positions /* If board_position = 'LDRSHPCOMM' this is a top position */
(member_id varchar(6),board_position varchar(18));

Create table board_members 
(empl_id varchar(6), member_id varchar(6));

Create table emp 
(empl_id varchar(6),ename varchar(32),report_to varchar(6));

Insert into board_positions values('CEO','LDRSHPCOMM');
Insert into board_positions Values('COO','LDRSHPCOMM');
Insert into board_positions Values('CFO','LDRSHPCOMM');
Insert into board_positions Values('CIO','LDRSHPCOMM');
Insert into board_positions values('WANABE','NEWBIE');

Insert into emp ('TOPDOG','Big Guy','TOPDOG');
Insert into emp ('WALLET','Money Bags','TOPDOG');
Insert into emp ('OPSGUY','Meikut Work','TOPDOG');
Insert into emp ('INFGUY','Comp U Turk','TOPDOG');
Insert into emp ('HITECH','Number 2','INFGUY');
Insert into emp ('LOTECH','Number 3','HITECH');
Insert into emp ('PROGMR','Nameless Blameless','LOTECH');
insert into emp ('FLUNKY','Ida Dunnit','PROGMR');

Insert into board_members ('TOPDOG','CEO');
Insert into board_members ('WALLET','CFO');
Insert into board_members ('OPSGUY','COO');
Insert into board_members ('INFGUY','CIO');
Insert into board_members ('HITECH','WANABE');  /* Board position not on the leadership committee */

Используя что-то вроде:

CREATE VIEW LEADER_VIEW AS
   WITH T1 AS (SELECT e.empl_id, (something) as board_lead
               , (something) as board_lead_pos
           FROM emp e
           LEFT OUTER JOIN board_members bm
                        ON bm.empl_id = e.empl_id
           LEFT OUTER JOIN board_positions bp
                        on bp.member_id = bm.member_id
          ...
           CONNECT BY PRIOR empl_id = report_to
           START WITH empl_id = report_to
           )
  SELECT * FROM T1

(Но я знаю, что это гораздо больше, чем это!)

Пример желаемого вывода...

TOPDOG         TOPDOG  CEO  (Because self is on LDRSHPCOMM)
WALLET         WALLET  CFO  (Because self is on LDRSHPCOMM)
OPSGUY         OPSGUY  COO  (Because self is on LDRSHPCOMM)
INFGUY         INFGUY  CIO  (Because self is on LDRSHPCOMM)
HITECH         INFGUY  CIO  (Because REPORTTO is on LDRSHPCOMM)
LOTECH         INFGUY  CIO  (Because REPORTTO->REPORTTO is on LDRSHPCOMM)
PROGMR         INFGUY  CIO  (REPORTTO->REPORTTO->REPORTTO is on LDRSHPCOMM)
FLUNKY         INFGUY  CIO  (You know by now.)
6
задан OMG Ponies 11 April 2012 в 02:03
поделиться