sábado, 7 de janeiro de 2017

Breadcumbs - Genealogia - Migalha de Pão


Neste post trata se de migalha de pão / breadcumbs / genealogia, segue código SQL Server 2008:

--Criando a Tabela Genealógica
CREATE TABLE TB_PAIFILHOS
( CODIGO INTEGER NOT NULL
 ,CODIGOPAI INTEGER 
 ,NOME  VARCHAR(50)
 ,GERACAO INT,
PRIMARY KEY (codigo ASC)) ON [PRIMARY]
GO

--Inserindo dados Genealógicos
INSERT INTO TB_PAIFILHOS SELECT 1, NULL, 'FORTUNATO', 1
INSERT INTO TB_PAIFILHOS SELECT 2,    1, 'ROBERTO'  , 2
INSERT INTO TB_PAIFILHOS SELECT 3,    2, 'RICARDO'  , 3
INSERT INTO TB_PAIFILHOS SELECT 4,    3, 'LAUREN'   , 4
INSERT INTO TB_PAIFILHOS SELECT 5,    3, 'SARAH'    , 4
INSERT INTO TB_PAIFILHOS SELECT 6,    1, 'DIONÍSIO' , 2
GO

--Funcao com o uso de Recursividade (MIGALHAS DE PAO GENEALÓGICA)
--DROP FUNCTION FN_MIGALHADEPAO
CREATE FUNCTION FN_MIGALHADEPAO() RETURNS @TB_RESULTADO TABLE(CODIGO INT, NOME VARCHAR(MAX), MIGALHA VARCHAR(MAX))
BEGIN
 WITH TB_RELACAO_PAISFILHOS(CODIGO, NOME, TODOS) AS 
 (
  SELECT PAI.CODIGO, CAST(PAI.NOME AS VARCHAR(MAX)), CAST(PAI.NOME AS VARCHAR(MAX))
    FROM TB_PAIFILHOS          PAI
   WHERE PAI.CODIGOPAI IS NULL
  UNION ALL
  SELECT PAI.CODIGO, CAST(PAI.NOME AS VARCHAR(MAX)), CTE.TODOS+'>'+PAI.NOME
    FROM TB_PAIFILHOS          PAI
 INNER JOIN TB_RELACAO_PAISFILHOS CTE ON CTE.CODIGO = PAI.CODIGOPAI
   WHERE PAI.CODIGOPAI IS NOT NULL
 )
 INSERT INTO @TB_RESULTADO
 SELECT CODIGO, NOME, TODOS FROM TB_RELACAO_PAISFILHOS ORDER BY 3
 RETURN
END
GO


--Consulta verificando se Sarah tem parentesco com Fortunato caso retorne dados
SELECT * FROM FN_MIGALHADEPAO() WHERE NOME = 'SARAH' AND MIGALHA LIKE '%FORTUNATO%'