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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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