Ci sono un paio di modi in cui potresti guardare questo. La prima opzione potrebbe essere più semplice se hai più familiarità con i database rispetto all'algebra relazionale, mentre la seconda sarà più semplice (e più accurata per problemi più complessi) se hai familiarità con l'algebra relazionale.
Prima le tabelle:
Inizia calcolando i tuoi join. Sai che hai i tuoi tre set (tavoli) Guest
, Reservation
e Room
, tutti e tre con sono uniti naturali (congiunti interni). Quindi potresti iniziare a scrivere la tua query in questo modo:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
Una volta completato, applica le tue condizioni:
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;
In alternativa puoi inserire la condizione per g.age
nel join a Reservation
, ma si consiglia di inserire condizioni in WHERE
clausola per INNER JOIN
.
Infine, inserisci il tuo 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;
Ordine delle operazioni
Per questo, scrivi la tua query usando l'ordine delle operazioni. Quindi tutto ciò che è racchiuso tra parentesi viene eseguito per primo. In questo modo, inizi scrivendo la query su Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
Il prossimo set sarebbe Reservations
, ed è naturale unito:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Infine, vieni nella Room
insieme, sempre unito naturale:
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;