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%'