[Pgsql-ayuda] Consulta SQL

iafmgc@unileon.es iafmgc@unileon.es
Fri, 7 Sep 2001 17:36:50 MET


Hola,

Siento si este no es el lugar de hacer este tipo de consultas. Si no es a=
si,
lo siento de antemano. Quiero hacer una consulta en mi base de datos de
PostgreSQL.

Tengo la siguientes tablas en mi base de datos:

cdroms
-------
codigo_cdroms

items
-----
codigo_items
descripcion

cdroms_item
-------------
codigo_cdroms
codigo_items

prestamos
----------
codigo_prestamo

reservas
--------
codigo_reserva


Bueno la consulta que quiero hacer busca los Cd-Roms que contienen un ite=
m
con una descripcion determinada, es decir yo busco que items en la tabla
items tienen el campo descripcion igual al dato proporcionado por el usua=
rio
y a continuaci=F3n hago unos joins con las tablas de cdroms_items y cdrom=
s
para saber en que CD-Roms esta/n dicho item. Hasta ahi bien, no he tenido
ning=FAn problema.

 Mi problema viene cuando me gustar=EDa mostrar dos campos indicando si e=
sta
prestado y en ese caso si esta reservado o no.
Despu=E9s de mucho mirar vi que tal vez la soluci=F3n era la sentencia CA=
SE
(diganme si existe otra alternativa). Con un CASE todo va bien (es decir
solo pruebo p.ej. a ver si esta prestado), el problema es cuando a=F1ado =
otro
CASE para ver si esta reservado, solo funciona en caso de que haya regist=
ros
en la base de datos, sino hay ninguno me dice que solo puede cargar un
m=E1ximo de 200 registros.

 Les pongo a continuaci=F3n que consulta he hecho, he hecho una prueba
buscando cadenas en el campo descripcion de items que contengan la cadena
'net':

 SELECT
droms.codigo_cdroms,cdroms_etiqueta,items.descripcion,cdroms.disponible,p=
res
tamos.codigo_prestamo,
prestamos.contenido,reservas.codigo_reserva,reservas.contenido,
  (case
      when
          cdroms.codigo_cdroms=3Dcdroms_items.codigo_cdroms
          and cdroms.codigo_cdroms=3Dcodigo_prestamo
          and cdroms_items.codigo_items=3Ditems.codigo_items
          and items.descripcion like %net%
          then 'Si' else 'No'
   end)
   as prestado,
  (case
      when
          cdroms.codigo_cdroms=3Dcdroms_items.codigo_cdroms
          and cdroms.codigo_cdroms=3Dcodigo_prestamo
          and cdroms.codigo_cdroms=3D ANY (select codigo_reserva from
reservas)
          and cdroms_items.codigo_items=3Ditems.codigo_items
          and items.descripcion like %net%
          then 'Si' else 'No'
   end)
   as reservado

   from cdroms,items,cdroms_items,prestamos,reservas
      where
          cdroms.codigo_cdroms=3Dcdroms_items.codigo_cdroms
          and prestamos.contenido=3D'cdroms'
          and cdroms_items.codigo_items=3Ditems.codigo_items
          and items.descripcion like '%net%';

Como les digo me funciona cuando hay registros, pero no cuando no hay
ninguno, que es lo que hago mal? Tengo algun error de sintaxis o de
concepto?

 Gracias por anticipado

 Saludos

 Miguel