sacar UNICAMENTE las hojas de cualquier nivel de una consulta recursiva

From: Hellmuth Vargas <hivs77(at)gmail(dot)com>
To: Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: sacar UNICAMENTE las hojas de cualquier nivel de una consulta recursiva
Date: 2018-10-04 15:48:23
Message-ID: CAN3Qy4os5H2UrgRRBStxmMTwuPEZ+ccRfwp+kAehYBx=0tjdxw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mauro Silva 2018-10-06 18:54:31 Re: [pgsql-es-ayuda] Cadena con dos puntos
Previous Message Alvaro Herrera 2018-10-03 18:11:54 Re: Sobre Obdc