Usuário com melhor resposta
Obter níveis intermediários de uma CTE com recursividade

Pergunta
-
Ola, pessoal
Precisaria obter todos os "id" que uma consulta CTE passou, e estou com uma dúvida em como fazer isso:
No caso do 39044, precisaria pegar uma informação referente ao 39043, que é o "Valor já pago" dele.
(bem como poderia ser preciso de outros níveis anteriores)
O fato é que tenho colunas apenas para o Titulo de Origem, e para o Título de Destino. Mas não tem como ter colunas diretamente para cada codigo "intermediário".
Precisaria de uma tabelinha com esses "codigos" para com ela, juntar com a consulta principal e pesquisar os valores de pagamentos já feitos.
Isso é possível?
Obs.: Esta dúvida surgiu em uma outra demanda em que o José Diz prestou grande auxílio:
https://social.msdn.microsoft.com/Forums/pt-BR/7f46fa14-5ef9-4558-922f-6f2049ca1249/cte-com-recursividade?forum=520#485a6817-33d6-4820-9bcf-d3bb0b9f1713
Julio C.
- Editado Julio Costi terça-feira, 3 de março de 2020 19:31
Respostas
-
Deleted
- Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:39
-
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
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
-
Deleted
- Marcado como Resposta Julio Costi quarta-feira, 18 de março de 2020 19:39
-
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