Er zijn een paar manieren waarop je hier naar kunt kijken. De eerste optie is misschien makkelijker als je meer vertrouwd bent met databases dan met relationele algebra, terwijl de tweede makkelijker (en nauwkeuriger voor complexere problemen) zal zijn als je bekend bent met relationele algebra.
Tafels eerst:
Begin met het uitzoeken van je joins. Je weet dat je je drie sets (tafels) hebt Guest
, Reservation
, en Room
, alle drie met zijn natuurlijk verbonden (binnenste verbonden). Dus je zou kunnen beginnen met het schrijven van je vraag als volgt:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
Zodra dat is voltooid, past u uw voorwaarden toe:
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;
Als alternatief kunt u de voorwaarde voor g.age
in de join naar Reservation
, maar het wordt aanbevolen om voorwaarden in de WHERE
. te zetten clausule voor INNER JOIN
.
Ten slotte vult u uw 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;
Volgorde van bewerkingen
Hiervoor schrijft u uw vraag in volgorde van bewerkingen. Dus alles tussen haakjes wordt eerst uitgevoerd. Als je het op deze manier doet, begin je met het schrijven van de query tegen Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
De volgende set is Reservations
, en dat is natuurlijk verbonden:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Eindelijk kom je bij de Room
set, weer natuurlijk samengevoegd:
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;