Requête SQL entre 3 tables
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)
.
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.