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

Re: Problema con consulta simple

From: "Jairo Grateron" <jgrateron(at)gmail(dot)com>
To: Sergio <ximelis(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Problema con consulta simple
Date: 2007-02-28 15:09:41
Message-ID: b6f02a050702280709w62de30c1sa64140a72ef75a1@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Hola Sergio ya resolviste el problema pero con esta función de los contrib
de postgresql te puede ayudar en otras cosas.

database_test=> select * from delegaciones;
 id_delegacion |    nombre     | padre
---------------+---------------+-------
             1 | Principal          |
             2 | Barcelona       |     1
             3 | Madrid            |     1
             4 | gerona            |     1
             5 | lleida               |     1
             6 | rubi                 |     2
             7 | sant cugat      |     2
             8 | terrassa          |     2
             9 | castellana       |     3
            10 | lavapies         |     3
            11 | ximelis            |     6
            12 | can serrafosa |     6
            13 | casa               |     6
(13 filas)

Estan todos los registros con sus relaciones

instalamos la funcion del contrib tablefun

CREATE OR REPLACE FUNCTION connectby(text, text, text, text, int4)
  RETURNS SETOF record AS
'$libdir/tablefunc', 'connectby_text'
  LANGUAGE 'c' STABLE STRICT;

esta funcion sirve para hacer una consulta de una tabla que tenga una
relacion de padre e hijo en la misma tabla, y crea el nivel de cada
registro. es como generar el arbol de relaciones.

1er parametro: nombre de la tabla
2do parametro: campo clave
3er parametro: campo padre
4to parametro: el codigo del campo clave inicial
5to parametro: hasta el nivel a mostrar, 0 significa todos.


probamos ahora

database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','1',0)
                                          AS t(keyid text, parent_keyid
text, level int);
 keyid | parent_keyid | level
-------+--------------+-------
 1     |              |     0
 2     | 1            |     1
 6     | 2            |     2
 11    | 6            |     3
 12    | 6            |     3
 13    | 6            |     3
 7     | 2            |     2
 8     | 2            |     2
 3     | 1            |     1
 9     | 3            |     2
 10    | 3            |     2
 4     | 1            |     1
 5     | 1            |     1
(13 filas)

si ves primero aparece el padre, despues sus hijos y en el caso del id 2 se
muestrar los nietos de 2.
y el nivel de ellos.



database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','2',0)  AS t(keyid text, parent_keyid text, level
int);
 keyid | parent_keyid | level
-------+--------------+-------
 2     |              |     0
 6     | 2            |     1
 11    | 6            |     2
 12    | 6            |     2
 13    | 6            |     2
 7     | 2            |     1
 8     | 2            |     1
(7 filas)

Muestra todos los hijos y nietos de id_delegacion  2


database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','3',0)  AS t(keyid text, parent_keyid text, level
int);
 keyid | parent_keyid | level
-------+--------------+-------
 3     |              |     0
 9     | 3            |     1
 10    | 3            |     1
(3 filas)

Muestra todos los hijos de id_delegacion  3

database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','6',0)  AS t(keyid text, parent_keyid text, level
int);
 keyid | parent_keyid | level
-------+--------------+-------
 6     |              |     0
 11    | 6            |     1
 12    | 6            |     1
 13    | 6            |     1
(4 filas)


Muestra todos los hijos de id_delegacion  6


database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','2',1)  AS t(keyid text, parent_keyid text, level
int);
 keyid | parent_keyid | level
-------+--------------+-------
 2     |              |     0
 6     | 2            |     1
 7     | 2            |     1
 8     | 2            |     1


muestra solo los hijos directos del id_delegacion 2 porque le coloque nivel
1


database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','1',0)  AS t(keyid text, parent_keyid text, level
int) LEFT JOIN delegaciones on id_delegacion=keyid order by level;
 keyid | parent_keyid | level | id_delegacion |    nombre     | padre
-------+--------------+-------+---------------+---------------+-------
 1     |              |     0 |             1 | Principal     |
 2     | 1            |     1 |             2 | Barcelona     |     1
 3     | 1            |     1 |             3 | Madrid        |     1
 4     | 1            |     1 |             4 | gerona        |     1
 5     | 1            |     1 |             5 | lleida        |     1
 10    | 3            |     2 |            10 | lavapies      |     3
 6     | 2            |     2 |             6 | rubi          |     2
 7     | 2            |     2 |             7 | sant cugat    |     2
 8     | 2            |     2 |             8 | terrassa      |     2
 9     | 3            |     2 |             9 | castellana    |     3
 11    | 6            |     3 |            11 | ximelis       |     6
 12    | 6            |     3 |            12 | can serrafosa |     6
 13    | 6            |     3 |            13 | casa          |     6
(13 filas)


el join con delegaciones para obtener los demas campos y ordenados por el
nivel.


database_test=> select * from connectby ('delegaciones',
'id_delegacion','padre','1',1)  AS t(keyid text, parent_keyid text, level
int) LEFT JOIN delegaciones on id_delegacion=keyid order by level;
 keyid | parent_keyid | level | id_delegacion |  nombre   | padre
-------+--------------+-------+---------------+-----------+-------
 1     |              |     0 |             1 | Principal |
 2     | 1            |     1 |             2 | Barcelona |     1
 3     | 1            |     1 |             3 | Madrid    |     1
 4     | 1            |     1 |             4 | gerona    |     1
 5     | 1            |     1 |             5 | lleida    |     1
(5 filas)


todos los campos para los hijos directos del id 1



Saludos.

In response to

Responses

pgsql-es-ayuda by date

Next:From: SergioDate: 2007-02-28 15:15:21
Subject: Re: Problema con consulta simple
Previous:From: SergioDate: 2007-02-28 14:01:10
Subject: Re: Problema con consulta simple

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