Jose Luis Balle wrote:
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ó:




Gracias por la respuesta Jose Luis, casi lo he comprendido todo, solo me resta la parte de darme cabezazos intentando realizarlo. Ahora, va sonar un poco mal en este ámbito y quizás me quieran matar, pero me han pedido que no sea PostgreSQL sino que sea MySQL ¿alguna idea al respecto? ¿es el mismo basamento?

--
Saludos
ReynierPM
--
TIP 1: para suscribirte y desuscribirte, visita 
http://archives.postgresql.org/pgsql-es-ayuda

Responder a