Hola Lista

Recientemente tuve que  actualizar unos campos  de una tabla recursiva pero
únicamente de los registros  hijos (u hojas como también se denominan):
osea de aquellos registros que no tengan 'hijos', realice el siguiente
ejemplo para ilustrar como  saque los hijos pero  tengo la duda si había
alguna otra forma de hacerlo. Que opinas ustedes?

with base as (
select * from
(values (1,'nivel_0',null),
(2,'nivel_1a',1),
(4,'nivel_2a',2),
(8,'nivel_3a',4),
                (10,'hijo_41a',8),
                (12,'hijo_42a',8),
                (6,'hijo_2b',2),
(3,'nivel_1b',1),
(5,'nivel_2b',3),
(7,'hijo_3b',5)
) as a(id,nombre,idpadre)
)
, base1 as (
WITH RECURSIVE t(idpadre,id,path,nivel) AS (
                SELECT a.id,a.id,a.nombre::text, 1
                FROM base as a
                WHERE a.idpadre is null
              UNION ALL
                SELECT a.idpadre,a.id,t.path || '@'|| a.nombre,  t.nivel+1
                FROM base as a join t on a.idpadre=t.id
            )
            SELECT * FROM t

), base2 as (
select a.id,a.path,b.path as hijos
from base1 as a
left join base1 as b on b.path  like '%' || a.path || '%' and length(b.path
)> length(a.path )
)
select a.id,a.path from base2 as a  where a.hijos is null




-- 
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
EnterpriseDB Certified PostgreSQL 9.3 Associate

Reply via email to