waldyl
Messages postés3Date d'inscriptionmercredi 29 octobre 2008StatutMembreDernière intervention27 avril 2011
-
5 avril 2010 à 16:23
waldyl
Messages postés3Date d'inscriptionmercredi 29 octobre 2008StatutMembreDernière intervention27 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 !
cs_vpoyo
Messages postés363Date d'inscriptionvendredi 14 février 2003StatutMembreDernière intervention20 avril 20106 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
)