Il y a deux façons de voir cela. La première option peut être plus facile si vous êtes plus familier avec les bases de données que l'algèbre relationnelle, tandis que la seconde sera plus facile (et plus précise pour les problèmes plus complexes) si vous êtes familier avec l'algèbre relationnelle.
Tableaux d'abord :
Commencez par déterminer vos jointures. Vous savez que vous avez vos trois ensembles (tableaux) Guest
, Reservation
, et Room
, tous les trois avec sont joints naturels (joints intérieurs). Vous pouvez donc commencer à écrire votre requête comme suit :
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
Une fois cette opération terminée, appliquez vos conditions :
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_
WHERE g.age < 20;
Sinon, vous pouvez mettre la condition pour g.age
dans la jointure à Reservation
, mais il est recommandé de mettre des conditions dans le WHERE
clause pour INNER JOIN
.
Enfin, vous remplissez votre SELECT
:
SELECT g._guestId_,
res._roomId_,
r.price
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_
WHERE g.age < 20;
Ordre des opérations
Pour cela, vous écrivez votre requête en utilisant l'ordre des opérations. Ainsi, tout ce qui est entre parenthèses est exécuté en premier. En procédant ainsi, vous commencez par écrire la requête sur Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
L'ensemble suivant serait Reservations
, et qui est naturellement joint :
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Enfin, vous arrivez dans la Room
ensemble, encore une fois naturel joint :
SELECT g._guestId_,
res._roomId_,
r.price
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_
WHERE g.age < 20;