Oracle SQL: как сделать иерархию и для каждого «листа» сделать выбор в другую таблицу - PullRequest
0 голосов
/ 22 марта 2012

У меня есть два связанных объекта "ESTABELECIMENTO" и "LOCAL_PRESCRICAO", и для каждого узла иерархии "ESTABELECIMENTO" я хочу перечислить "детей" в "LOCAL_PRESCRICAO" ...

enter image description here

Понимаете ... Я могу создать иерархию "ESTABELECIMENTO" таким образом

select lpad(' ',2*(level-1)) 
      || estabelecimento.id 
      || ' ' || estabelecimento.nomecompleto
from estabelecimento
where estabelecimento.activo = 1
start with estabelecimento.id = 36
connect by prior estabelecimento.id = estabelecimento.estabelecimetnopaiid

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

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Это должно быть сделано так, как вам нужно.

WITH e
  AS (SELECT    LPAD (' ', 2 * (LEVEL - 1))
             || estabelecimento.id
             || ' '
             || estabelecimento.nomecompleto
        FROM estabelecimento
       WHERE estabelecimento.activo = 1
       START WITH estabelecimento.id = 36
     CONNECT BY PRIOR estabelecimento.id = estabelecimento.estabelecimetnopaiid)
SELECT e.*,
       lp.*
  FROM e
 INNER JOIN ESTABELECIMENTO_LOCAL_PRESCRICAO elp
    ON (e.id = elp.estabelecimentoid)
 INNER JOIN LOCAL_PRESCRICAO lp
    ON (lp.id = elp.localprescricaoid);

Он вернет все строки, выбранные вами в иерархическом запросе, вместе с соответствующими строками из таблицы LOCAL_PRESCRICAO.

Надеюсь, это поможет ...

EDIT:

Мои извинения, я пропустил соединение идентификатора с другими полями. Это должно решить проблему.

WITH e
  AS (SELECT rownum AS rnum, e_data, id
        FROM (SELECT    LPAD (' ', 2 * (LEVEL - 1))
                     || estabelecimento.id
                     || ' '
                     || estabelecimento.nomecompleto AS e_data,
                     estabelecimento.id AS id
                FROM estabelecimento
               WHERE estabelecimento.activo = 1
               START WITH estabelecimento.id = 36
             CONNECT BY PRIOR estabelecimento.id = estabelecimento.estabelecimetnopaiid))
SELECT e.e_data,
       lp.*
  FROM e
 INNER JOIN ESTABELECIMENTO_LOCAL_PRESCRICAO elp
    ON (e.id = elp.estabelecimentoid)
 INNER JOIN LOCAL_PRESCRICAO lp
    ON (lp.id = elp.localprescricaoid)
 ORDER BY e.rnum;
0 голосов
/ 22 марта 2012

Соедините результаты вашего иерархического запроса с 2 другими таблицами, используя подзапрос:

select lpad(' ',2*(x.level-1))     
              || x.estabelecimentoid      
              || ' ' || x.nomecompleto  
  from (select rownum r, level,
               , estabelecimento.id estabelecimentoid 
               , estabelecimento.nomecompleto nomecompleto
          from estabelecimento 
         where estabelecimento.activo = 1 
         start with estabelecimento.id = 36 
        connect by prior estabelecimento.id = estabelecimento.estabelecimetnopaiid
       ) x, 
       estabelecimento_local_PRESCRICAO elp, local_prescricao lp
 where lp.id = elp.local_prescricao_id 
   and x.estabelecimentoid = elp.estabelecimetnopaiid
order by r; -- to maintain ordering of the result the same as order of rows from 'x' subquery
...