Re: como manejar selects recursivos?

From: Diego Gil <diego(at)adminsa(dot)com>
To: Claudia Villa <cvilla75(at)hotmail(dot)com>
Cc: PostgreSQL Spanish <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: como manejar selects recursivos?
Date: 2005-02-28 21:56:06
Message-ID: 1109627766.5219.14.camel@roadwarrior.adminsa.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Claudia:

Hay quienes arman estos arboles con "nested sets". Busca mas sobre esto
en google. A mi me parece un poco complicado.

Por otro lado, podes hacer una funcion que haga el trabajo recursivo.
Por ejemplo, la siguiente funcion retorna el "path" o nombre completo de
una categoria dado un codigo numerico.

Dada la tabla :

CREATE TABLE subjects
(
subject_id int4 NOT NULL,
subject_name varchar(60),
subject_parent int4,
CONSTRAINT subjects_pk PRIMARY KEY (subject_id),
CONSTRAINT subjects_subject_parent_fk FOREIGN KEY (subject_parent)
REFERENCES subjects (subject_id) ON UPDATE RESTRICT ON DELETE RESTRICT
)
WITHOUT OIDS;

esta es la funcion recursiva :

CREATE OR REPLACE FUNCTION full_subject_name(int4)
RETURNS "varchar" AS
$BODY$

DECLARE v_subject_id ALIAS FOR $1;
DECLARE tmp_record RECORD;
DECLARE tmp_id VARCHAR;
DECLARE tmp_name VARCHAR;

BEGIN
tmp_name:='';

SELECT INTO tmp_record * FROM subjects WHERE subjects.subject_id
= v_subject_id;

IF NOT FOUND THEN
RETURN ''::varchar;
END IF;

IF tmp_record.subject_name = NULL THEN
RETURN tmp_record.subject_name;
END IF;

tmp_id := full_subject_name(tmp_record.subject_parent);

IF tmp_record.subject_name IS NOT NULL THEN
tmp_name := tmp_id::varchar || '/' ||
tmp_record.subject_name::varchar || '';
END IF;

RETURN tmp_name;
END;

$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Espero que te sirva como base para resolver tu inquietud.

Diego.

El lun, 28-02-2005 a las 13:41 -0600, Claudia Villa escribió:
> necesito hacer una consulta recursiva,
> tengo la siguiente tabla:
>
> SELECT id,id_padre,nombre from temas;
> id |id_padre| nombre
> ----+---------- +--------------
> 1 | | Tema 1
> 2 | 1 | Sub Tema 1
> 3 | 1 | Sub Tema 2
> 4 | 2 | Sub Tema 1.1
>
> como hacer para que me muestre todos los hijos de un tema , incluyendo los
> hijos de los hijos?
>
> alguien ya ha hecho algo similar?
>
> ojala y alguien pueda ayudarme....
> gracias de antemano.
>
> _________________________________________________________________
> Platica con tus amigos en linea con T1msn Messenger
> http://messenger.t1msn.com.mx/
>
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 10: visita nuestro canal de IRC #postgresql-es en irc.freenode.net
>
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message gonzalo sáenz 2005-02-28 22:01:48 Re: como manejar selects recursivos?
Previous Message Ivan Figueroa 2005-02-28 21:50:23 Re: Usuario para backup en Windows 2003