none
Obter níveis intermediários de uma CTE com recursividade RRS feed

Respostas

  • Deleted
    • Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:39
    quarta-feira, 11 de março de 2020 14:23
  • Julio,

    Acredito que seja possível, precisamos entender até qual nível de hieraquia você precisa ou pretende gerar, pois estamos falando do uso de CTEs recursivas que por padrão chegamos no máximo ao nível de número 100, mas que pode ser aumentado.

    Existe algum tipo de relacionamento entre este Ids? Pergunto isso pois ficaria bem mais fácil estabelecer todo caminho.

    Mas a muito tempo, tive a necessidade de elaborar um cenário para criar uma árvore de níveis, utilizei este exemplo:

    WITH DepTree (referenced_id, referenced_name, referencing_id, referencing_name, NestLevel)
     AS 
    (
        SELECT  o.[object_id] AS referenced_id , 
         o.name AS referenced_name, 
         o.[object_id] AS referencing_id, 
         o.name AS referencing_name,  
         0 AS NestLevel
     FROM  sys.objects o 
        WHERE o.name = 't_demo_4'
        
        UNION ALL
        
        SELECT  d1.referenced_id,  
         OBJECT_NAME( d1.referenced_id) , 
         d1.referencing_id, 
         OBJECT_NAME( d1.referencing_id) , 
         NestLevel + 1
         FROM  sys.sql_expression_dependencies d1 
      JOIN DepTree r ON d1.referenced_id =  r.referencing_id
    )
    SELECT DISTINCT referenced_id, referenced_name, referencing_id, referencing_name, NestLevel
     FROM DepTree WHERE NestLevel > 0
    ORDER BY NestLevel, referencing_id; 

    Em um exemplo que normalmente eu utilizo em minhas aulas quando apresento a parte de CTE, se relaciona com a Hierarquia de cargos em uma empresa, que nos permite identificar o nível em relação ao empregado e seu superior:

    CREATE TABLE tblCli 
    (Codigo INT, 
    Nome VARCHAR(40), 
    CodigoSup INT)
    Go
    
    
    INSERT INTO tblCli VALUES (1,'Presidente', NULL)
    
    INSERT INTO tblCli VALUES (2,'Superintendente', 1)
    
    INSERT INTO tblCli VALUES (3,'Gerente', 2)
    
    INSERT INTO tblCli VALUES (4,'Coordenador', 3)
    
    INSERT INTO tblCli VALUES (5,'Supervisor', 4)
    
    INSERT INTO tblCli VALUES (6,'Analista', 5)
    
    INSERT INTO tblCli VALUES (7,'Estagiário', 6)
    
    INSERT INTO tblCli VALUES (8,'Conselheiro', 1)
    
     
    
    WITH Rel
    
    AS (
    
    SELECT Nome, 1 AS Nivel, Codigo FROM tblCli
    
    WHERE CodigoSup IS NULL
    
    UNION ALL
    
    SELECT tblCli.Nome, Nivel + 1, tblCli.Codigo FROM Rel
    
    INNER JOIN tblCli ON Rel.Codigo = tblCli.CodigoSup
    
    )
    
     
    
    SELECT REPLICATE('--',Nivel) + '> ' + Nome
    FROM Rel 
    ORDER BY Nivel

    Sei que estes exemplos não se relacionam a sua necessidade, mas são alternativas que podem lhe nortear a construir seu próprio código tendo como base o que você já utiliza atualmente.

    Acredito que o exemplo que você obteve no outro post que o outro argumentador elaborou seja um forma aplicável de você construir o que precisa.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    • Editado Junior Galvão - MVPMVP quarta-feira, 4 de março de 2020 12:11
    • Marcado como Resposta Julio Costi quinta-feira, 5 de março de 2020 11:34
    • Não Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:31
    • Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:39
    quarta-feira, 4 de março de 2020 12:08

Todas as Respostas

  • Julio,

    Acredito que seja possível, precisamos entender até qual nível de hieraquia você precisa ou pretende gerar, pois estamos falando do uso de CTEs recursivas que por padrão chegamos no máximo ao nível de número 100, mas que pode ser aumentado.

    Existe algum tipo de relacionamento entre este Ids? Pergunto isso pois ficaria bem mais fácil estabelecer todo caminho.

    Mas a muito tempo, tive a necessidade de elaborar um cenário para criar uma árvore de níveis, utilizei este exemplo:

    WITH DepTree (referenced_id, referenced_name, referencing_id, referencing_name, NestLevel)
     AS 
    (
        SELECT  o.[object_id] AS referenced_id , 
         o.name AS referenced_name, 
         o.[object_id] AS referencing_id, 
         o.name AS referencing_name,  
         0 AS NestLevel
     FROM  sys.objects o 
        WHERE o.name = 't_demo_4'
        
        UNION ALL
        
        SELECT  d1.referenced_id,  
         OBJECT_NAME( d1.referenced_id) , 
         d1.referencing_id, 
         OBJECT_NAME( d1.referencing_id) , 
         NestLevel + 1
         FROM  sys.sql_expression_dependencies d1 
      JOIN DepTree r ON d1.referenced_id =  r.referencing_id
    )
    SELECT DISTINCT referenced_id, referenced_name, referencing_id, referencing_name, NestLevel
     FROM DepTree WHERE NestLevel > 0
    ORDER BY NestLevel, referencing_id; 

    Em um exemplo que normalmente eu utilizo em minhas aulas quando apresento a parte de CTE, se relaciona com a Hierarquia de cargos em uma empresa, que nos permite identificar o nível em relação ao empregado e seu superior:

    CREATE TABLE tblCli 
    (Codigo INT, 
    Nome VARCHAR(40), 
    CodigoSup INT)
    Go
    
    
    INSERT INTO tblCli VALUES (1,'Presidente', NULL)
    
    INSERT INTO tblCli VALUES (2,'Superintendente', 1)
    
    INSERT INTO tblCli VALUES (3,'Gerente', 2)
    
    INSERT INTO tblCli VALUES (4,'Coordenador', 3)
    
    INSERT INTO tblCli VALUES (5,'Supervisor', 4)
    
    INSERT INTO tblCli VALUES (6,'Analista', 5)
    
    INSERT INTO tblCli VALUES (7,'Estagiário', 6)
    
    INSERT INTO tblCli VALUES (8,'Conselheiro', 1)
    
     
    
    WITH Rel
    
    AS (
    
    SELECT Nome, 1 AS Nivel, Codigo FROM tblCli
    
    WHERE CodigoSup IS NULL
    
    UNION ALL
    
    SELECT tblCli.Nome, Nivel + 1, tblCli.Codigo FROM Rel
    
    INNER JOIN tblCli ON Rel.Codigo = tblCli.CodigoSup
    
    )
    
     
    
    SELECT REPLICATE('--',Nivel) + '> ' + Nome
    FROM Rel 
    ORDER BY Nivel

    Sei que estes exemplos não se relacionam a sua necessidade, mas são alternativas que podem lhe nortear a construir seu próprio código tendo como base o que você já utiliza atualmente.

    Acredito que o exemplo que você obteve no outro post que o outro argumentador elaborou seja um forma aplicável de você construir o que precisa.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    • Editado Junior Galvão - MVPMVP quarta-feira, 4 de março de 2020 12:11
    • Marcado como Resposta Julio Costi quinta-feira, 5 de março de 2020 11:34
    • Não Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:31
    • Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:39
    quarta-feira, 4 de março de 2020 12:08
  • Deleted
    • Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:39
    quarta-feira, 11 de março de 2020 14:23
  • José,

    esta situação , desde tópico, eu acabei resolvendo, sim.

    No outro tópico, surgiu uma nova demanda , daquela mesma situação. Foram questões que surgiram na sequencia, até então, o que eu havia solicitado estava resolvido.

    Vou deixar aqui marcado como resposta, e desmarcar as de lá, então.

    Aquele tópico é mais antigo, e conforme tivemos outros contatos recentemente, comentei que marquei as respostas (naquele e em vários outros) que na época me ajudaram a resolver aqueles problemas . Para não abrir outro tópico, coloquei dúvidas da sequencia do projeto lá.




    • Editado Julio Costi quarta-feira, 18 de março de 2020 20:35
    quarta-feira, 18 de março de 2020 19:39