Problême de Requête SQL dans une BdD

waldyl Messages postés 3 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 27 avril 2011 - 5 avril 2010 à 16:23
waldyl Messages postés 3 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 27 avril 2011 - 11 avril 2010 à 14:39
Bonjour à toutes et à tous :)

J'ai un petit soucis au niveau d'une requête, je me remet donc à vous, sans vous sur-estimez


Voila l'idée de la requête :
"Quelles chambres d'un hôtel donné sont libres aux périodes indiquées ?"

Je "navigue" entre 3 tables assez simples :

CREATE TABLE RESERVATION
   (
     NUM_RESERVATION NUMBER(4) NOT NULL, 
     NUM_CLIENT NUMBER(4) NOT NULL,
     DATE_DEMANDE_RESA DATE ,
     ARRHES_VERSE CHAR(32) , -- TRUE OR FALSE
     DATE_DEB_RES DATE ,
     DATE_FIN_RES DATE ,
     CONSTRAINT PK_RESERVATION PRIMARY KEY (NUM_RESERVATION) 
   );


CREATE TABLE CHAMBRE
   (
     NUM_CHAMBRE NUMBER(4) NOT NULL,
     NUM_HOTEL NUMBER(4) NOT NULL,
     CONSTRAINT PK_CHAMBRE PRIMARY KEY (NUM_HOTEL, NUM_CHAMBRE) 
   );



CREATE TABLE CONCERNE
   (
     NUM_RESERVATION NUMBER(4) NOT NULL,
     NUM_HOTEL NUMBER(4) NOT NULL,
     NUM_CHAMBRE NUMBER(4) NOT NULL,
     NB_OCCUPANT NUMBER(4) ,
     CONSTRAINT PK_CONCERNE PRIMARY KEY (NUM_RESERVATION, NUM_HOTEL, NUM_CHAMBRE) 
   );




Voici la requête que j'essaie de faire passer :



SELECT NUM_CHAMBRE NumeroChambre
FROM CHAMBRE C1
WHERE NOT EXISTS ( SELECT NUM_RESERVATION
   FROM  RESERVATION R
   WHERE NOT EXISTS 	( SELECT NUM_CHAMBRE 
  FROM CONCERNE C2
  WHERE C1.NUM_CHAMBRE    = C2.NUM_CHAMBRE
  AND R.NUM_RESERVATION = C2.NUM_RESERVATION
  AND C2.NUM_HOTEL      = (SELECT NUM_HOTEL
           FROM HOTEL														                                           WHERE UPPER(NOMHOTEL) = UPPER('&NOMHOTEL')))
  AND R.DATE_FIN_RES < TO_DATE('&DateDebut_DDslashMMslashYYYY', 'DD/MM/YYYY')
  AND R.DATE_DEB_RES > TO_DATE('&DateFin_DDslashMMslashYYYY', 'DD/MM/YYYY'))
/




-- &NOMHOTEL 											: nom de l'hôtel en paramètre
-- TO_DATE(&DateDebut_DDslashMMslashYYYY, 'DD/MM/YYYY') : Date du début du séjour ( format : DD/MM/YYYY )
-- TO_DATE(&DateFin_DDslashMMslashYYYY, 'DD/MM/YYYY')   : Date de fin du séjour   ( format : DD/MM/YYYY )
-- DateDebut doit être supérieur à une date de fin de réservation pour la chambre,
-- de même DateFin doit être inférieur à une date de début de réservation pour la chambre.



Comme vous vous en doutez, le requête ne fonctionne pas, puisque me renvoi un nombre de tuple abérant.
Je ne sais pas si c'est une petite bricole où toute la syntaxe qui est à revoir,
c'est pourquoi j'aimerai avoir votre avis, en cette journée ce qui cloche !

Dylan.

2 réponses

cs_vpoyo Messages postés 363 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 20 avril 2010 6
8 avril 2010 à 16:36
salut essaye ceci :

en résonnant de l'intérieur vers l'extérieur, je sélectionne les réservations existantes dans la plage,
ensuite on sélectionne les chambres dans la table "CONCERNE" pour lesquels il y a une réservation,
pour finir on prend les chambres qui n'ont pas de réservation

SELECT C1.NUM_CHAMBRE NumeroChambre
FROM CHAMBRE C1
WHERE
NOT EXISTS
(
SELECT 1
FROM CONCERNE C2
WHERE
EXISTS
(
SELECT 1
FROM RESERVATION R
WHERE R.DATE_FIN_RES < TO_DATE('&DateDebut_DDslashMMslashYYYY', 'DD/MM/YYYY')
AND R.DATE_DEB_RES > TO_DATE('&DateFin_DDslashMMslashYYYY', 'DD/MM/YYYY')
AND R.NUM_RESERVATION = C2.NUM_RESERVATION
)
AND C2.NUM_CHAMBRE = C1.NUM_CHAMBRE
AND C2.NUM_HOTEL = C1.NUM_HOTEL
)

Cordialement,
Vincent
0
waldyl Messages postés 3 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 27 avril 2011
11 avril 2010 à 14:39
Merci,

je test ça au plus vite :)
0
Rejoignez-nous