-----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-----
--
TIP 10: no uses HTML en tu pregunta, seguro que quien responda no podr� leerlo

Responder a