Det finns två sätt att se på detta. Det första alternativet kan vara lättare om du är mer bekant med databaser än relationalgebra, medan det andra blir enklare (och mer exakt för mer komplexa problem) om du är bekant med relationalgebra.
Tables First:
Börja med att ta reda på dina anslutningar. Du vet att du har dina tre set (tabeller) Guest
, Reservation
och Room
, alla tre med är naturligt sammanfogade (inre sammanfogade). Så du kan börja skriva din fråga så här:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
När det är klart, tillämpa dina villkor:
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;
Alternativt kan du sätta villkoret för g.age
i kopplingen till Reservation
, men det rekommenderas att sätta villkor i WHERE
klausul för INNER JOIN
.
Slutligen fyller du i din 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;
Ordning av operationer
För detta skriver du din fråga med hjälp av operationsordning. Så allt inom en parentes exekveras först. Om du gör det på detta sätt börjar du med att skriva frågan mot Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
Nästa uppsättning skulle vara Reservations
, och det är naturligt förenat:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Slutligen kommer du till Room
set, återigen naturligt sammanfogat:
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;