El lun, 17-11-2008 a las 11:04 +0100, Pablo Braulio escribió:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> 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.

> Lo que necesito es que los resultados sean del modo:
> 
>   nombre   | apellidos | clientes | fichero de ....
> - - -----------+-----------+----------+----------------
>  MARIA     | TIGRE     | No       | No
>  MARIA     | TIGRE     | No       | No
>  Manolo    | Grillote  | No       | No
>  Manolo    | Grillote  | No       | No
>  MANOLILLO | GAFOTAS   | No       | No
>  MANOLILLO | GAFOTAS   | Si       | No
> 
> He buscado información y he visto el uso de transform y pivot, pero no
> consigo que funcione.
> 
> ¿Alguien sabría decirme como hacer esto con postgres?.
> - --
> Saludos cordiales.
> Pablo.
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
> 
> iEYEARECAAYFAkkhQagACgkQK7lGsMchFszJSACfRVzVN+xevDZa81JCk6yWvrwC
> DOgAni1UVkDzNGlqZndPhB0Ly1/GKgMq
> =5VUA
> -----END PGP SIGNATURE-----
> --
> TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
>                http://archives.postgresql.org/pgsql-es-ayuda

--
TIP 8: explain analyze es tu amigo

Responder a