Consulta SQL

Muy Buenas, tengo una duda sobre como hacer una consulta lo más rápido posible en un programa de reserva de instalaciones:
Tabla Instalaciones:
InstalacionID
Denomimacion
Tabla Horas:
HoraID
InstalacionID
Tabla ReservasRealizadas:
ReservaID
InstalacionID
Fecha
HoraID
Lo que necesito es que me liste todas las horas de una determinada instalación en una fecha en concreto y que me diga si existe una reserva para cada hora de esa fecha o esa instalación. Lo ideal sería que la consulta me diese como resultado 3 columnas:
InstalacionID                      HoraID                      Reservada
Instalación 1 Hora 1 Falso
Instalación 1 Hora 2 Verdadero
Instalación 1 Hora 3 Falso
Instalación 2 Hora 1 Falso
Instalación 2 Hora 2 Verdadero
... Etc...
Si no se pude hacer con una sola consulta me gustaría saber la forma más rápida para hacerlo, gracias.
Respuesta
1
Te paso una solución a ver si está bien con tu modelo, traté con SQL standard primero pero a esta altura ya no se si es tan estándar y la segunda es TSQL. A mi me gusta más la sintaxis TSQL u Oracle para los joins, así que prefiero lo segundo.
No se en qué sql lo estás implementando, pero te repito que es de sqlserver esta respuesta, en Oracle el *=  para indicar un outer join (left en este caso) se reemplaza por =(+) y va del lado opuesto.
SELECT i.INSTALACIONID, h.HORAID, CASE
WHEN r.RESERVAID IS NULL THEN 'No Reservado'
ELSE 'Reservado'
END as reservado, FECHA
FROM
instalaciones i INNER join horas h
ON (i.instalacionid=h.instalacionid)
LEFT JOIN reservasrealizadas r
ON (h.instalacionid=r.instalacionid AND h.horaid=r.horaid
AND R.FECHA='07/05/2007' OR R.RESERVAID IS NULL )
ORDER BY 1, 2
---------------------------------------------------------------------------------------------
SELECT i.INSTALACIONID, h.HORAID, CASE
WHEN r.RESERVAID IS NULL THEN 'No Reservado'
ELSE 'Reservado'
END as reservado, FECHA
FROM instalaciones i,horas h ,reservasrealizadas r
WHERE i.instalacionid=h.instalacionid
AND h.instalacionid*=r.instalacionid
AND h.horaid*=r.horaid
AND (R.FECHA='07/05/2007' OR R.RESERVAID IS NULL)
ORDER BY 1, 2
--------------------------------------------------------------------------

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas