Question

J'ai 3 tables (notez que ce n'est peut-être pas la meilleure conception de base de données SQL)

Room: TypeName, RoomNumber
RoomType: TypeName, ...
Reservation: StartDate, EndDate, TypeName, RoomNumber

Mes paramètres d'entrée sont startdate et enddate . J'aimerais connaître les types de salles disponibles. A ma connaissance, la solution est la suivante: AvailableRoomTypes = AllRoomTypes - UnavailableRoomTypes

Évidemment, AllRoomTypes peut être trouvé par: SELECT DISTINCT (TypeName) FROM room; et je sais comment obtenir des salles indisponibles, mais pas des types de salles indisponibles. Je ne sais pas non plus comment soustraire un ensemble à un autre. Je peux obtenir un ensemble de tous les chambres + types de chambres et un autre ensemble de chambres + types de chambres non disponibles, mais comment puis-je les rejoindre de telle sorte qu'il s'agisse de AB ? Peut-être une sorte de fonction NOT_CONTAINS ?

Je souhaite que mes paramètres de sortie soient SELECT * FROM RoomType (pour les types de salle appropriés) .

Était-ce utile?

La solution

RoomTypes inutilisés

select RT.* 
from RoomType RT
where RT.TypeName not in (
   Select RM.TypeName 
   from Room RM
) 

une façon de faire la sélection A-B n’est "pas dans (sélectionnez ..)" opérateur, non existe (sélectionnez ..) est un autre et il y aura plus, je suis certain.

Autres conseils

SELECT t.*
  FROM ROOMTYPE t
 WHERE NOT EXISTS(SELECT NULL 
                    FROM RESERVATION r
                    JOIN ROOM ro ON ro.roomnumber = r.roomnumber
                   WHERE ro.typename = t.typename
                     AND r.startdate BETWEEN ?IN_START_DATE AND ?IN_END_DATE
                     AND r.enddate BETWEEN ?IN_START_DATE AND ?IN_END_DATE)

Room: TypeName, RoomNumber RoomType: TypeName, ... Reservation: StartDate, EndDate, TypeName, RoomNumber

C'est peut-être votre réponse ...
sélectionnez rt.typename
à partir de room r, type de chambre rt, reservation re
où r.typename = rt.typename
et rt.typename = re.typename
où re.startdate =: date_début

and re.enddate =: endate

Vous ne souhaitez pas utiliser UNION - SUM (type de réservation) et SUM (service.servicetype) sont des attributs différents. Mais si vous le faisiez, vous voudriez utiliser des valeurs NULL pour décaler les requêtes afin que les colonnes ne se chevauchent pas. IE:

SELECT SUM(reservation.roomtype), NULL ...
UNION ALL
SELECT NULL, SUM(service.servicetype) ...

En fonction de la logique que vous avez fournie, voici la requête que j'ai formulée:

SELECT SUM(r.roomtype),
       SUM(s.servicetype)
  FROM RESERVATION r
  JOIN BILL b ON b.reservationid = r.reservationid
             AND b.paid = 1
  JOIN SERVICE s ON s.serviceid = b.serviceid

Cela renverra une seule ligne. Nous aurions besoin de savoir sur quoi la requête (ou les requêtes dépendant de l'information) est groupée afin de renvoyer un résultat plus significatif. Les détails des tables RESERVATION et SERVICE nous aideraient à pouvoir vous aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top