Líder Recursivo - Oracle 10g x 11g

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
scudeler
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Dom, 26 Set 2010 3:35 am
Localização: Joinville-SC

Estamos tendo um problema ao adaptar um SQL Recursivo do 11g para10g.

Oracle 11g Query ( Funcionando como esperado! )

Selecionar tudo

WITH ADRECURSIVEUSERLEADER (CDLEADER,CDUSER,NMUSER,FGUSERENABLED)
AS
(
    SELECT US.CDLEADER AS CDLEADER
          ,US.CDUSER AS CDUSER
          ,US.NMUSER
          ,US.FGUSERENABLED
      FROM ADUSER US
     WHERE 1 = 1
     UNION ALL
    SELECT RS.CDLEADER
          ,US.CDUSER
          ,US.NMUSER
          ,US.FGUSERENABLED
      FROM ADRECURSIVEUSERLEADER RS
           INNER JOIN ADUSER US 
               ON RS.CDUSER = US.CDLEADER
     WHERE 1 = 1
)
SELECT * 
  FROM ADRECURSIVEUSERLEADER T
 WHERE 1 = 1;
----------------------------

Oracle 10g Query ( Como estamos tentando fazer )

Selecionar tudo

WITH ADRECURSIVEUSERLEADER 
AS
(
    SELECT US.CDLEADER AS CDLEADER
          ,US.CDUSER AS CDUSER
          ,US.NMUSER
          ,US.FGUSERENABLED
      FROM ADUSER US
     START WITH US.CDLEADER IS NULL         -- parent
   CONNECT BY PRIOR US.CDUSER = US.CDLEADER -- child / parent
)
SELECT * 
  FROM ADRECURSIVEUSERLEADER T
 WHERE 1 = 1;
-----------------------------------

Qual é o problema?

Nós temos a seguinte estrutura de liderança:

User code (CDUSER) 5 is the CEO
User code (CDUSER) 21 is the Manager (Leaded by 5)
User code (CDUSER) 937 is the Leader (Leaded by 21)
User code (CDUSER) 1276 is the Developer (Leaded by 937)

Se eu pesquisar pelo Líder no 10g e 11g :

Selecionar tudo

AND T.CDLEADER = 21
11g trás dois registros:

* Um para o 937 ( Leader )
* Um para o 1276 ( Developer )


10g me trás apenas um registro:

* Um para o 937 ( Leader )

--------------------------------------

SQL Fiddle Example : http://sqlfiddle.com/#!4/8200a/1/0

DDL for Oracle:

Selecionar tudo

CREATE TABLE ADUSER (CDUSER          NUMBER(10)
                    ,CDLEADER        NUMBER(10)
                    ,FGUSERENABLED   NUMBER(2)
                    ,NMUSER          VARCHAR2(255) );

INSERT INTO ADUSER VALUES (   5, NULL, 1, 'CEO Name');
INSERT INTO ADUSER VALUES (  21,    5, 1, 'Manager Name');
INSERT INTO ADUSER VALUES ( 937,   21, 1, 'Leader Name');
INSERT INTO ADUSER VALUES (1276,  937, 1, 'Developer Name');
--------------------------------------

O que precisamos?

Nós precisamos saber todos que estão abaixo do líder pesquisado ( Inclusive liderados do liderado pelo líder e assim por diantfazer isso no Oracle 10gsso no Oracle 10g?

Muito Obrigado!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Não sei se atende perfeitamente o seu problema.

Mas ao invés de consultar toda hierarquia de chefia para posteriormente filtrar apenas o líder desejado, por que não já filtrar o líder desejado de cara? Veja exemplo onde tem o parâmetro do código do líder e retorna os dois subalternos desejados:

Selecionar tudo

   SELECT &CODLEADER AS CDLEADER
          ,US.CDUSER AS CDUSER
          ,US.NMUSER
          ,US.FGUSERENABLED
      FROM ADUSER US
     START WITH US.CDLEADER = &CODLEADER         -- parent
   CONNECT BY PRIOR US.CDUSER = US.CDLEADER -- child / parent   ;   
scudeler
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Dom, 26 Set 2010 3:35 am
Localização: Joinville-SC

Muito obrigado pela resposta Daniel. Porém eu precisava no formato de view.

Segue abaixo como consegui:

Selecionar tudo

WITH ADRECURSIVEUSERLEADER
    AS
    (
        SELECT CONNECT_BY_ROOT US.CDLEADER AS CDLEADER
              ,US.CDUSER AS CDUSER
              ,US.NMUSER
              ,US.FGUSERENABLED
          FROM ADUSER US
       CONNECT BY PRIOR US.CDUSER = US.CDLEADER -- child / parent
    )
    SELECT *
      FROM ADRECURSIVEUSERLEADER T
     WHERE 1 = 1
order by  cdleader, cduser
;
https://community.oracle.com/message/13243416#13243416
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 19 visitantes