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