Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Drandrão

[Resolvido] Select Recursivo

Recommended Posts

Bom dia

 

Estou com o seguinte problema....

 

tenho uma tabela desse tipo:

 

PAI | FILHO | NOME

 

001 002 Teste

 

001 003 Teste1

 

001 001 Teste2

 

010 001 Teste3

 

015 015 Teste4

 

002 005 Teste5

 

 

 

Aí gostaria de dar um select, passando o pai '010' e obter por exemplo os filhos teste, teste1 e teste2. E assim por diante, por exemplo se o teste2 tivesse filho, ele mostraria tbém....

 

Achei algumas buscas feitas más não consegui adaptar...

 

 

 

Desde já agradeço a ajuda

 

Evandro

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Fiz da seguinte forma

 

WITH ConsultaRecursiva AS (SELECT Pai.PAI, Pai.FILHO, Pai.NOME

FROM TABELA Pai

WHERE (Pai.PAI = '001')

UNION ALL

SELECT C.FILHO, C.PAI, C.NOME

FROM TABELA C

INNER JOIN ConsultaRecursiva CR ON (CR.FILHO = C.PAI))

SELECT * FROM ConsultaRecursiva OPTION (maxrecursion 32767)

 

 

 

Más dá o seguinte erro:

 

The statement terminated. The maximum recursion 32767 has been exhausted before statement completion

(1,671 sec)

 

 

 

Alguém sabe o que pode ser???

 

 

 

Obrigado

 

Evandro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro, creio que o problema é o registro '001 001 Teste2' o registro 001 não pode ser o seu próprio pai, uma possível solução seria deixar o pai como NULL, assim: 'null 001 Teste2'

 

exemplo:

CREATE TABLE #TABELA (PAI INT, FILHO INT, NOME VARCHAR(30))

INSERT INTO #TABELA VALUES (1, 2, 'Teste')
INSERT INTO #TABELA VALUES (1, 3, 'Teste1')
INSERT INTO #TABELA VALUES (1, NULL, 'Teste2')
INSERT INTO #TABELA VALUES (10, 1, 'Teste3')
INSERT INTO #TABELA VALUES (15, NULL, 'Teste4')
INSERT INTO #TABELA VALUES (2, 5, 'Teste5')
GO

  SELECT FILHO, PAI, NOME
    FROM #TABELA
   WHERE PAI = 1
GO


WITH TBL_RECURSIVE(FILHO, PAI, NOMEFUNCIONARIO) AS
(
  SELECT FILHO, PAI, NOME
    FROM #TABELA
   WHERE PAI = 1
   UNION ALL
  SELECT F.FILHO, F.PAI, NOME
    FROM #TABELA F,
         TBL_RECURSIVE R
   WHERE R.FILHO = F.PAI
)
SELECT * FROM TBL_RECURSIVE
ORDER BY PAI, FILHO

DROP TABLE #TABELA 

retorna:

FILHO       PAI         NOMEFUNCIONARIO
----------- ----------- ------------------------------
NULL        1           Teste2
2           1           Teste
3           1           Teste1
5           2           Teste5

(4 row(s) affected)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro, creio que o problema é o registro '001 001 Teste2' o registro 001 não pode ser o seu próprio pai, uma possível solução seria deixar o pai como NULL, assim: 'null 001 Teste2'

 

exemplo:

CREATE TABLE #TABELA (PAI INT, FILHO INT, NOME VARCHAR(30))

INSERT INTO #TABELA VALUES (1, 2, 'Teste')
INSERT INTO #TABELA VALUES (1, 3, 'Teste1')
INSERT INTO #TABELA VALUES (1, NULL, 'Teste2')
INSERT INTO #TABELA VALUES (10, 1, 'Teste3')
INSERT INTO #TABELA VALUES (15, NULL, 'Teste4')
INSERT INTO #TABELA VALUES (2, 5, 'Teste5')
GO

  SELECT FILHO, PAI, NOME
    FROM #TABELA
   WHERE PAI = 1
GO


WITH TBL_RECURSIVE(FILHO, PAI, NOMEFUNCIONARIO) AS
(
  SELECT FILHO, PAI, NOME
    FROM #TABELA
   WHERE PAI = 1
   UNION ALL
  SELECT F.FILHO, F.PAI, NOME
    FROM #TABELA F,
         TBL_RECURSIVE R
   WHERE R.FILHO = F.PAI
)
SELECT * FROM TBL_RECURSIVE
ORDER BY PAI, FILHO

DROP TABLE #TABELA 

retorna:

FILHO       PAI         NOMEFUNCIONARIO
----------- ----------- ------------------------------
NULL        1           Teste2
2           1           Teste
3           1           Teste1
5           2           Teste5

(4 row(s) affected)

 

Perfeito....Era isso mesmo

 

Obrigado...

Abraços

Evandro

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.