Lo Prometido.
La tabla:
CREATE TABLE items
(
  id serial NOT NULL,
  padre bigint NOT NULL,
  nombre character varying(300) NOT NULL,
  descripcion text,
  CONSTRAINT items_pkey PRIMARY KEY (id)
)
WITH (OIDS=TRUE);

La función, en realidad como recursiva, tantas veces como sea
necesario hasta llegar a la última hoja -1  que es la hoja en sí, el
registro.
CREATE OR REPLACE FUNCTION getancestor(este character varying, item integer)
  RETURNS character varying AS
$BODY$
DECLARE
retorno integer;
BEGIN
SELECT padre INTO retorno FROM items WHERE id=item;
IF  NOT FOUND OR retorno=0 THEN
        return este;
ELSE
        return getancestor(retorno::varchar||'.'||este,retorno);
END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' STABLE
  COST 100;
ALTER FUNCTION getancestor(character varying, integer) OWNER TO user;

Y no anda tan mal, 391ms sobre 1678 filas, lo que en realidad me toma
mucho tiempo es una vista que me sumariza cada hoja del árbol
Seq Scan on items  (cost=0.00..480.28 rows=1678 width=159)

En fin, no se si es lo mejor pero por ahora me sirve.
Voy a investigar tu recomendación Alvaro, gracias.
Saludos

El día 27 de octubre de 2009 23:00, Alvaro Herrera
<[email protected]> escribió:
> Jose Luis Balle escribió:
>> Yo tengo implementado una especie de rubro sub-rubro de la misma
>> forma, pero a la hora de retornar el codigo 1.1.2.4 hice una función
>> de agregación pero me toma mucho tiempo. Está bien que el fierro no
>> acompaña pero sobre 4000 registros demora su tiempo.
>> Mañana subo la función y te paso bien los tiempos.
>> De todas formas no conozco otra forma de implementar jerarquía en
>> bases de datos relacional
>
> El problema es que tienes que recorrer la tabla cuatro veces para
> encontrar la descripción.  Puedes usar ltree para hacerlo más rápido.
> Es un módulo contrib, usa índices GiST si mal no recuerdo.
>
> En Postgres 8.4 una de las novedades es la funcionalidad WITH RECURSIVE
> que permite responder en una sola consulta esta clase de cosas, mucho
> más simple y seguramente más rápido que cualquier otra forma de hacerlo.
>
> --
> Alvaro Herrera       Vendo parcela en Valdivia:  http://rie.cl/?a=255568
> "El sabio habla porque tiene algo que decir;
> el tonto, porque tiene que decir algo" (Platon).
>



-- 
“Frecuentemente me preguntan en las conferencias: ¿por qué deberíamos
creerles a ustedes los escépticos? Mi respuesta es: no deberían
creernos. No deberían creer a nadie basándose en la autoridad o
posición que esta persona tenga. ”
Michael Shermer
--
TIP 5: ¿Has leído nuestro extenso FAQ?
         http://www.postgresql.org/docs/faqs.FAQ.html

Responder a