Connect by

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
marciabm
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sáb, 21 Mai 2005 7:12 pm
Localização: São Caetano do Sul - SP

Tenho uma query que tem um join e utiliza o connect by. Só que com esse connect by, ele usa só a PK de uma tabela e faz full na outra. Já tentei criar índices, mas nada resolve.

A query é mais ou menos isso:

Selecionar tudo

select *
from tabelaA, tabelaB
where tabelaA.id = tabelaB.id
start with tabelaB.id = 1
connect by prior tabelaB.id = tabelaB.id_filho
Alguém já viu isso?

Obrigada

Márcia
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Estranho...
Fiz um teste aqui no SCOTT e também fez FULL, mesmo eu filtrando pela PK.
Veja exemplo abaixo:

Selecionar tudo

SQL> COL ENAME FORMAT A25
SQL> COL PATH FORMAT A35
SQL> 
SQL> select  
  2    rpad(' ',level*2)||' '|| ename   ENAME
  3  , SYS_CONNECT_BY_PATH(ename, '/')  PATH
  4  , level
  5  from SCOTT.emp 
  6  WHERE EMPNO >7600
  7  connect by prior empno=mgr
  8  start with ename='KING'
  9  /

ENAME                     PATH                                    LEVEL
------------------------- ----------------------------------- ---------
   KING                   /KING                                       1
       SCOTT              /KING/JONES/SCOTT                           3
         ADAMS            /KING/JONES/SCOTT/ADAMS                     4
       FORD               /KING/JONES/FORD                            3
     BLAKE                /KING/BLAKE                                 2
       MARTIN             /KING/BLAKE/MARTIN                          3
       TURNER             /KING/BLAKE/TURNER                          3
       JAMES              /KING/BLAKE/JAMES                           3
     CLARK                /KING/CLARK                                 2
       MILLER             /KING/CLARK/MILLER                          3

10 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   FILTER
   2    1     CONNECT BY (WITH FILTERING)
   3    2       NESTED LOOPS
   4    3         TABLE ACCESS (FULL) OF 'EMP'
   5    3         TABLE ACCESS (BY USER ROWID) OF 'EMP'
   6    2       NESTED LOOPS
   7    6         BUFFER (SORT)
   8    7           CONNECT BY PUMP
   9    6         TABLE ACCESS (FULL) OF 'EMP'




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         46  consistent gets
          0  physical reads
          0  redo size
        770  bytes sent via SQL*Net to client
        422  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          9  sorts (memory)
          0  sorts (disk)
         10  rows processed

SQL> 

ou seja... a dúvida continua... :-(
sp66d_rac6r
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 02 Dez 2008 10:43 am
Localização: Sorocaba-SP

Como separar o resultado do SYS_CONNECT_BY_PATH em colunas?

P.e.

O Retorno abaixo:

Selecionar tudo

/KING/JONES/SCOTT/ADAMS 
Separado em colunas

Selecionar tudo

hier1|hier2|hier3|hier4|...
KING|JONES|SCOTT|ADAMS 
Agradeço desde já.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu fiz uma view assim alguns dias atrás, mas usei uma função pra separar:

Selecionar tudo

SELECT
  xg_pkg_qp_001.fnc_elemento(a.sep, 2,'|') grupo1
, xg_pkg_qp_001.fnc_elemento(a.sep, 3,'|') grupo2
, xg_pkg_qp_001.fnc_elemento(a.sep, 4,'|') grupo3
, xg_pkg_qp_001.fnc_elemento(a.sep2,2,'|') flex1
, xg_pkg_qp_001.fnc_elemento(a.sep2,3,'|') flex2
, xg_pkg_qp_001.fnc_elemento(a.sep2,4,'|') flex3
FROM
  (
  SELECT
    a.flex_value
  , a.parent_flex_value
  , LEVEL                                  lev
  , a.summary_flag
  , SYS_CONNECT_BY_PATH(description,  '|') sep
  , SYS_CONNECT_BY_PATH(a.flex_value, '|') sep2
  FROM apps.fnd_flex_value_children_v  a
  WHERE a.flex_value_set_id=1013810
  START WITH a.parent_flex_value='1000000'
  CONNECT BY PRIOR a.flex_value  = a.parent_flex_value
  )                               a
WHERE lev in (3)
ORDER BY 3,4,5
Eu usei uma função chamada ELEMENTO:
http://glufke.net/oracle/viewtopic.php?t=1653
Responder
  • Informação