sábado, 26 de novembro de 2011

Remover acentos em SQL SERVER 2005 / 2008 / 2012


APDSJ!

Função (store function) para remover acentos em SQL Server 2005, SQL Server 2008 e SQL Server 2012.

Funciona para maiúsculas e minúsculas e com banco de dados em latin1, mas pode ser adaptada facilmente para outro encoding.

Espero ter ajudado!


IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N'[dbo].[usf_rm_accent_pt_latin1]') 
               AND type IN (N'FN')
           )
 DROP FUNCTION usf_rm_accent_pt_latin1;
GO
CREATE FUNCTION usf_rm_accent_pt_latin1 (@txt varchar(max)) RETURNS varchar(max) 
-- Nome Artefato/Programa..: usf_rm_accent_pt_latin1.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 26/11/2011
-- Data Atualizacao........: 08/10/2012
-- Versao..................: 0.03
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008/2012
-- Kernel..................: Nao informado!
-- Finalidade..............: store function para remover acentos maiúsculos e minúsculos em latin1 pt
-- OBS.....................: só funciona para banco configurado com o collate latin1, para saber qual o collate do seu banco execute essa query 
-- ........................: SELECT DatabasePropertyEx(db_name(),'Collation');
--
BEGIN
DECLARE @txt0 varchar(max) 
 --caixa baixa
    SET @txt0 = replace(@txt COLLATE Latin1_General_BIN, char(225),'a')  --SELECT 'á',ASCII('á'); --225
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(224),'a')  --SELECT 'à',ASCII('à'); --224   
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(227),'a')  --SELECT 'ã',ASCII('ã'); --227 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(226),'a')  --SELECT 'â',ASCII('â'); --226
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(233),'e')  --SELECT 'é',ASCII('é'); --233 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(232),'e')  --SELECT 'è',ASCII('è'); --232
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(234),'e')  --SELECT 'ê',ASCII('ê'); --234
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(237),'i')  --SELECT 'í',ASCII('í'); --237 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(236),'i')  --SELECT 'ì',ASCII('ì'); --236
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(238),'i')  --SELECT 'î',ASCII('î'); --238 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(243),'o')  --SELECT 'ó',ASCII('ó'); --243
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(242),'o')  --SELECT 'ò',ASCII('ò'); --242
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(244),'o')  --SELECT 'ô',ASCII('ô'); --244
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(245),'o')  --SELECT 'õ',ASCII('õ'); --245
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(250),'u')  --SELECT 'ú',ASCII('ú'); --250
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(249),'u')  --SELECT 'ù',ASCII('ù'); --249
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(251),'u')  --SELECT 'û',ASCII('û'); --251 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(252),'u')  --SELECT 'ü',ASCII('ü'); --252 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(231),'ç')  --SELECT 'ç',ASCII('ç'); --231
 -- caixa alta
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(193),'A')  --SELECT 'Á',ASCII('Á'); --193
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(192),'A')  --SELECT 'À',ASCII('À'); --192  
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(194),'A')  --SELECT 'Â',ASCII('Â'); --194
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(195),'A')  --SELECT 'Ã',ASCII('Ã'); --195
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(201),'E')  --SELECT 'É',ASCII('É'); --201
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(200),'E')  --SELECT 'È',ASCII('È'); --200
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(202),'E')  --SELECT 'Ê',ASCII('Ê'); --202
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(205),'I')  --SELECT 'Í',ASCII('Í'); --205
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(204),'I')  --SELECT 'Ì',ASCII('Ì'); --204
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(206),'I')  --SELECT 'Î',ASCII('Î'); --206
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(211),'O')  --SELECT 'Ó',ASCII('Ó'); --211
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(210),'O')  --SELECT 'Ò',ASCII('Ò'); --210
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(212),'O')  --SELECT 'Ô',ASCII('Ô'); --212
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(213),'O')  --SELECT 'Õ',ASCII('Õ'); --213
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(218),'U')  --SELECT 'Ú',ASCII('Ú'); --218
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(217),'U')  --SELECT 'Ù',ASCII('Ù'); --217
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(219),'U')  --SELECT 'Û',ASCII('Û'); --219 
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(220),'U')  --SELECT 'Ü',ASCII('Ü'); --220
    SET @txt0 = replace(@txt0 COLLATE Latin1_General_BIN,char(199),'C')  --SELECT 'Ç',ASCII('Ç'); --199
     
 RETURN (@txt0)
END
GO
    
-- Exemplo de uso da function

-- Ex.: 01 - Removendo acentos nas consultas
-- SELECT dbo.usf_rm_accent_pt_latin1('café, Sofá, pé,caÇa, CAÇA, aviões, sapê, à, sítio, Avião, LÂMPADA, mesa, cadeira, AVIÕES');  
-- Retorno: cafe, Sofa, pe,caCa, CACA, avioes, sape, a, sitio, Aviao, LAMPADA, mesa, cadeira, AVIOES


-- Ex.: 02 - Removendo acentos no campo obs da tabela1 
-- UPDATE tabela1 SET obs = dbo.usf_rm_accent_pt_latin1(obs); 
--





O Peregrino agradece o acesso, tenha um bom trabalho!
:)

domingo, 20 de novembro de 2011

Como Validar Código de Barras GTIN, antigo EAN13 no SQL SERVER 2008


Como Validar Código de Barras GTIN, antigo EAN13 no SQL SERVER 2008

Com as exigências da SEFAZ, no tocante a Nota Fiscal Eletrônica, tornou-se uma exigência do Governo Federal Brasileiro o uso do código de barras EAN13 ou GTIN (Global Trade Item Number), válido.

Então segue uma store function desenvolvida em T-SQL do SQL Server 2008, para validar esse troço.

Depois vai ser o chip na mão e na testa ... Espero está na Glória com Cristo, para não vê o resultado final... 666 tá chegando...

Mas, enquanto não chega, segue uma store function para aliviar o stress de quem trabalhar com isso...

-- Nome Artefato/Programa..: sp_valida_ean13.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 20/11/2011
-- Data Atualizacao........: 22/11/2011
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: store procedure (function) para testa se um um código de barras (EAN13-GTIN) é valido ou não, retorna 1 para verdadeiro e 0 para falso 
-- OBS.....................: 
--

IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N'[dbo].[sp_valida_ean13]') 
               AND type IN (N'FN')
           )
 DROP FUNCTION sp_valida_ean13;
GO
CREATE FUNCTION sp_valida_ean13(@number varchar(max)) RETURNS smallint AS
BEGIN
 DECLARE @c bigint
 DECLARE @r smallint
 DECLARE @i smallint
 DECLARE @x smallint
 DECLARE @sum smallint
 DECLARE @mult smallint
 DECLARE @number_split varchar(1)
 SET @x   = 0
 SET @sum = 0 
 SET @i   = 1 
 SET @c   = len(@number)

 -- se cb for maior que 13 
 IF @c > 13 BEGIN
    SET @r = 0
 END

 -- se cb for menor que 13
 IF @c < 13 BEGIN
    SET @r = 0
 END

 --se for nulo 
 IF @number IS NULL BEGIN
    SET @r = NULL  
 
 END ELSE BEGIN

    --se não for nulo pode ser válido 
    SET @x = (SELECT CASE WHEN patindex('%[^0-9]%', @number) > 0 THEN 0 ELSE 1 END) 
 
    IF @c = 13 AND @x = 1  BEGIN

       WHILE @i<=(@c-1) BEGIN

          --fazendo um split do cb 
          SET @number_split=substring (@number,@i,1)
          --multiplicam-se os digitos do cb por 1 e por 3, em sequencia repetitiva de 1 e 3;
          IF (@i % 2) = 0 BEGIN
             SET @sum = @sum + cast(@number_split as int) * 3  
          END ELSE BEGIN
             SET @sum = @sum + cast(@number_split as int) * 1  
          END
          --incremento
          SET @i=@i+1

       END

       --com a soma do resultado das multiplicacoes...
       --sera necessario encontrar o multiplo de 10 mais proximo do resultado da soma. 
       --atencao: o multiplo de 10 deve ser maior ou igual ao resultado da soma (nunca menor).  
       SET @mult = ( ( 1 + cast(@sum / 10 as int) ) * 10 ) 
       --subtraindo o resultado da soma do multiplo que foi encontrado
       SET @mult = @mult - @sum 
       --o resultado desta subtracao será o digito verificador
       --entao se o ultimo digito do cb, isto e, 
       --13o numero for igual ao resultado desta subtracao entao e um cb valido

       IF cast(substring(@number,13,1) as int) = @mult BEGIN
          SET @r = 1
       END ELSE BEGIN
          SET @r = 0
       END   

    END ELSE BEGIN
       SET @r = 0 
    END    
 
 END --fim_se
 
 RETURN (@r)

END;
GO



-- Exemplo de Uso: 

-- Exemplo: 01, uso simples
-- O EAN13 impresso na Lata de Leite Ninho 400g
-- SELECT dbo.sp_valida_ean13('7891000142202');   --retorna 1, pois é valido 

-- Exemplo: 02, descobrir todos os produtos com EAN13 ou GTIN inválido 
-- SELECT * FROM produto WHERE dbo.sp_valida_ean13(gtim)=0; 
-- GO

Querys Recursivas no SQL Server

Querys Recursivas no SQL Server



Segue um exemplo prático de como fazer querys recursivas no SQL Server 2005/2008, usando genealogia.

O conceito de query recursiva é montar o resultado por níveis, identificando quem são as ocorrências "pais", depois "os filhos de primeiro nível", em seguida, "os filhos de segundo nível" e por conseguinte, mergulhando até encontrar, o último nível.

O Algorítmo da Query Recursiva é o seguinte:
Passo 1 - Encontrar todas as ocorrências de nível 1, o qual são chamados de ocorrências âncora.
Passo 2 - Baseado nas âncoras, identificar e selecionar todas as ocorrências de nível 2, recursividade
Passo 3 - Já em um processo recursivo, tomando por base o nível 2, identificar e selecionar todas as ocorrências de nível 3 e assim sucessivamente até chegar ao último nível.

Obs: Use esse recurso com moderação, pois quanto mais níveis, mais depreciado tende a ser o desempenho desta query.

Segue script para teste na prática de como fazer:
--
-- Nome Artefato/Programa..: querys_recursivas_no_sqlserver_2008 
-- Empresa.................: 
-- Autor(es)...............: Emerson Hermann (emersonhermann at gmail.com) http://emersonhermann.blogspot.com
-- Data Inicio ............: 19/11/2011
-- Data Atual..............: 19/11/2011
-- Versao..................: 0.01
-- Compilador/Interpretador: SQL Server 2008 
-- Sistemas Operacionais...: Windows
-- SGBD....................: SQL Server 2005/2008 R2
-- Kernel..................: Nao informado!
-- Finalidade..............: Usar querys recursivas no Sql Server 2008  
-- ........................: 
-- OBS.....................: 
--
 
 
/* testando no SQL Server 2008*/
 
--DROP TABLE genealogia;
CREATE TABLE genealogia
(
    id_genealogia integer     PRIMARY KEY
  , nome varchar(25)         NOT NULL
  , id_genealogia_pai integer NULL FOREIGN KEY REFERENCES genealogia(id_genealogia)
 
);
 
--TRUNCATE TABLE genealogia;
 
SELECT * FROM genealogia;
 
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (1,'ABRAÃO',NULL);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (2,'ISAC',1);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (3,'ESAÚ',2);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (4,'JACÓ',2);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (5,'RÚBEN',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (6,'SIMEÃO',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (7,'LEVI',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (8,'JUDÁ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (9,'ISSACAR',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (10,'ZEBULON',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (11,'JOSÉ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (12,'BENJAMIM',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (13,'DÃ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (14,'NAFTALI',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (15,'GADE',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (16,'ASER',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (17,'DINÁ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (18,'PEREZ',8);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (19,'ZERA',8);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (20,'ESRON',18);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (21,'ARÃO ',20);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (22,'AMINADABE',21);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (23,'NASSON',22);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (24,'SALMON',23);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (25,'BOAZ',24);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (26,'OBEDE',25);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (27,'JESSÉ',26);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (28,'DAVI',27);
 
SELECT * FROM genealogia;
 
 
--query 1, AUTO RELACIONAMENTO
 
            SELECT g1.nome
                 , g1.id_genealogia
                 , g2.id_genealogia_pai 
              FROM genealogia g1
         LEFT JOIN genealogia g2 
                ON g1.id_genealogia = g2.id_genealogia_pai 
                 ;   
 
--query 2, RECURSIVA 
 
WITH cte_recursiva (id_genealogia,nome,nivel,arvore)
AS
(
    -- 1a PARTE ANCORA
    SELECT id_genealogia
         , nome
         , 1 AS nivel
         , CAST(nome AS VARCHAR(255)) AS arvore 
      FROM genealogia
     WHERE id_genealogia_pai IS NULL
    
    UNION ALL
    
    -- 2a PARTE RECURSIVA
    SELECT g.id_genealogia
         , g.nome
         , c.nivel + 1 AS nivel
         , CAST((c.arvore + '/' + g.nome) AS VARCHAR(255)) AS arvore 
      FROM genealogia g
INNER JOIN cte_recursiva c 
        ON g.id_genealogia_pai = c.id_genealogia
    
)
SELECT nivel, arvore FROM cte_recursiva;




Sem stress...

Querys Recursivas no Postgres


Querys Recursivas no Postgres

Segue um exemplo prático de como fazer querys recursivas no Postgres, usando genealogia.

O conceito de query recursiva é montar o resultado por níveis, identificando quem são as ocorrências "pais", depois os "os filhos de primeiro nível", em seguida, "os filhos de segundo nível" e por conseguinte, mergulhando até encontrar, o último nível.

O Algorítmo da Query Recursiva é o seguinte:
Passo 1 - Encontrar todas as ocorrências de nível 1, o qual são chamados de ocorrências âncora.
Passo 2 - Baseado nas âncoras, identificar e selecionar todas as ocorrências de nível 2, recursividade
Passo 3 - Já em um processo recursivo, tomando por base o nível 2, identificar e selecionar todas as ocorrências de nível 3 e assim sucessivamente até chegar ao último nível.

O Modo como o Postgres, processa querys recursivas é bem semelhante ao do SGBDR SQL Server.

Obs: Use esse recurso com moderação, pois quanto mais níveis, mais depreciado tende a ser o desempenho desta query.

Segue script para teste na prática de como fazer:

--
-- Nome Artefato/Programa..: querys_recursivas_no_postgres 
-- Empresa.................: 
-- Autor(es)...............: Emerson Hermann (emersonhermann at gmail.com) http://emersonhermann.blogspot.com
-- Data Inicio ............: 19/11/2011
-- Data Atual..............: 19/11/2011
-- Versao..................: 0.01
-- Compilador/Interpretador: Postgres
-- Sistemas Operacionais...: Linux/Windows
-- SGBD....................: Postgres 8.4/9.0/9.1
-- Kernel..................: Nao informado!
-- Finalidade..............: Usar querys recursivas no Postgres 
-- ........................: 
-- OBS.....................: 
--
 
 
/* testando no Postgres 8.4/9.0/9.1 */
 
--DROP TABLE IF EXISTS genealogia;
CREATE TABLE genealogia
(
    id_genealogia integer     PRIMARY KEY
  , nome varchar(25)         NOT NULL
  , id_genealogia_pai integer NULL REFERENCES genealogia(id_genealogia)
 
);
 
--TRUNCATE TABLE genealogia;
 
SELECT * FROM genealogia;
 
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (1,'ABRAÃO',NULL);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (2,'ISAC',1);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (3,'ESAÚ',2);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (4,'JACÓ',2);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (5,'RÚBEN',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (6,'SIMEÃO',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (7,'LEVI',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (8,'JUDÁ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (9,'ISSACAR',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (10,'ZEBULON',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (11,'JOSÉ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (12,'BENJAMIM',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (13,'DÃ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (14,'NAFTALI',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (15,'GADE',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (16,'ASER',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (17,'DINÁ',4);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (18,'PEREZ',8);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (19,'ZERA',8);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (20,'ESRON',18);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (21,'ARÃO ',20);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (22,'AMINADABE',21);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (23,'NASSON',22);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (24,'SALMON',23);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (25,'BOAZ',24);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (26,'OBEDE',25);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (27,'JESSÉ',26);
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (28,'DAVI',27);
 
SELECT * FROM genealogia;
 
 
--query 1, AUTO RELACIONAMENTO
 
            SELECT g1.nome
                 , g1.id_genealogia
                 , g2.id_genealogia_pai 
              FROM genealogia g1
         LEFT JOIN genealogia g2 
                ON g1.id_genealogia = g2.id_genealogia_pai 
                 ;   
 
--query 2, RECURSIVA 
 
 
WITH RECURSIVE cte_recursiva (id_genealogia,nome,nivel,arvore)
AS
(
    -- 1a PARTE ANCORA
    SELECT id_genealogia
         , nome
         , 1 AS nivel
         , CAST(nome AS VARCHAR(255)) AS arvore
      FROM genealogia
     WHERE id_genealogia_pai IS NULL
    
    UNION ALL
    
    -- 2a PARTE RECURSIVA
    SELECT g.id_genealogia
         , g.nome
         , c.nivel + 1 AS nivel
         , CAST((c.arvore || '/' || g.nome) AS VARCHAR(255)) AS arvore 
      FROM genealogia g
INNER JOIN cte_recursiva c 
        ON g.id_genealogia_pai = c.id_genealogia
    
)
SELECT nivel
     , arvore 
  FROM cte_recursiva
     ;


Sem stress...