Re: Intentando referencias cruzadas.

From: Pablo Braulio <brulics(at)gmail(dot)com>
To: miguel <mvillagomez(at)sayab(dot)com(dot)mx>, Foro PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Intentando referencias cruzadas.
Date: 2008-11-19 07:55:47
Message-ID: 4923C683.30006@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

miguel escribió:
> El lun, 17-11-2008 a las 11:04 +0100, Pablo Braulio escribió:
> Hola a todos.
>
> Estoy tratando de realizar una consulta del tipo referencias cruzadas
> (creo que se llama así).
>
> El caso es que es la primera vez que lo intento, y no lo consigo.
>
> Tengo las siguientes tablas:
>
> \d empleados
> Table "public.empleados"
> Column | Type | Modifiers
> -
> -
> ------------------+-----------------------+--------------------------------------------------------
> id | integer | not null default
> nextval('empleados_id_seq'::regclass)
> empresa | integer | not null
> nombre | name | not null
> apellidos | character varying(50) | not null
> ....
> Indexes:
> "empleados_pkey" PRIMARY KEY, btree (id)
> Foreign-key constraints:
> "empleados_empresa_fkey" FOREIGN KEY (empresa) REFERENCES
> clientes(id) ON UPDATE CASCADE ON DELETE CASCADE
>
> \d ficheros
> Table "public.ficheros"
> Column | Type | Modifiers
> -
> -
> -------------+------------------------+-------------------------------------------------------
> id | integer | not null default
> nextval('ficheros_id_seq'::regclass)
> empresa | integer |
> nombre | character varying(40) | not null
> ...
> Indexes:
> "ficheros_pkey" PRIMARY KEY, btree (id)
> Foreign-key constraints:
> "ficheros_empresa_fkey" FOREIGN KEY (empresa) REFERENCES
> clientes(id) ON UPDATE CASCADE ON DELETE CASCADE
>
>
> \d ficheros_empleados
> Table "public.ficheros_empleados"
> Column | Type | Modifiers
> -
> -
> ----------+---------+-----------------------------------------------------------------
> id | integer | not null default
> nextval('ficheros_empleados_id_seq'::regclass)
> fichero | integer | not null
> empleado | integer | not null
> Indexes:
> "ficheros_empleados_pkey" PRIMARY KEY, btree (id)
> Foreign-key constraints:
> "ficheros_empleados_empleado_fkey" FOREIGN KEY (empleado) REFERENCES
> empleados(id) ON UPDATE CASCADE ON DELETE CASCADE
> "ficheros_empleados_fichero_fkey" FOREIGN KEY (fichero) REFERENCES
> ficheros(id) ON UPDATE CASCADE ON DELETE CASCADE
>
> Con la siguiente consulta obtengo los datos que necesito para luego armar la
> consulta cruzada:
>
> select e.nombre, e.apellidos, f.nombre, case when fe.empleado=e.id and
> fe.fichero=f.id then 'Si' else 'No' end as Acceso
> from empleados e, ficheros f, ficheros_empleados fe;
>
> nombre | apellidos | nombre | acceso
> - -----------+-----------+------------------+--------
> MARIA | TIGRE | fichero de ..... | No
> MARIA | TIGRE | clientes | No
> Manolo | Grillote | fichero de ..... | No
> Manolo | Grillote | clientes | No
> MANOLILLO | GAFOTAS | fichero de ..... | No
> MANOLILLO | GAFOTAS | clientes | Si
> (6 rows)
>
>
>> Prueba si te sirve esta consulta:
>
>> SELECT e.nombre, e.apellidos, (SELECT (CASE (COUNT(*)) WHEN 0 THEN 'No'
>> ELSE 'Si' END) FROM ficheros_empleados fe WHERE fe.empleado=e.id AND
>> fe.fichero=f.id)::varchar AS "fichero de ...."
>> FROM empleados e
>
>> Harías lo mismo para clientes.
>> Tal vez no sea la consulta que necesitas pero igual te puedes basar en
>> ella.
>

Hola.

Esa consulta, tal como la pones no funciona, habría que añadir el campo
ficheros al último from. De todos modos no es el resultado deseado:

# SELECT e.nombre, e.apellidos, (SELECT (CASE (COUNT(*)) WHEN 0 THEN 'No'
ELSE 'Si' END) FROM ficheros_empleados fe WHERE fe.empleado=e.id AND
fe.fichero=f.id)::varchar AS "fichero de ...."
FROM empleados e, ficheros f;
nombre | apellidos | fichero de ....
- -----------+--------------+-----------------
MARIA | TIGRE | No
MANOLILLO | GAFOTAS | No
Manuel | Garcia Lopez | No
MARIA | TIGRE | No
MANOLILLO | GAFOTAS | Si
Manuel | Garcia Lopez | No
(6 rows)

Creo que no me debí expresar bien en el mensaje inicial.

Lo que quiero conseguir es una tabla de este tipo.

nombre | apellidos | fich clientes | fichero de ....
- -----------+-----------+---------------+----------------
MARIA | TIGRE | No | No
Manolo | Grillote | No | No
MANOLILLO | GAFOTAS | Si | No

Segun he visto en manuales de sql, existe el uso de TRANSFORM y PIVOT
para realizar lo que se llama tablas de referencia cruzada, que creo que
es el tipo de tabla o consulta que quiero generar.

El caso es que no encuentro que funcione en postgresql.

¿No hay nada para esto en postgresql?.
- --
Saludos cordiales.
Pablo.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkkjxoMACgkQK7lGsMchFsy2OQCZAV8xnGUlCEcaJfXiAU64lZ6j
/hoAn2vE4Y8Rjk2BaqdlgaCpWQ+NKly0
=/s/y
-----END PGP SIGNATURE-----

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pablo Braulio 2008-11-19 08:59:20 Re: Intentando referencias cruzadas.
Previous Message Eduardo Gutierrez 2008-11-19 06:37:02 RE: Ayuda urgente y supongo facil ( mañana entrego practicas)