Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group