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.
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 |