Hay un par de formas en las que podrías ver esto. La primera opción puede ser más fácil si está más familiarizado con las bases de datos que con el álgebra relacional, mientras que la segunda será más fácil (y más precisa para problemas más complejos) si está familiarizado con el álgebra relacional.
Tablas primero:
Comience por averiguar sus uniones. Sabes que tienes tus tres conjuntos (mesas) Guest
, Reservation
y Room
, los tres con están unidos naturalmente (unidos internamente). Así que podrías empezar a escribir tu consulta así:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
Una vez que esté completo, aplique sus condiciones:
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;
Alternativamente, puede poner la condición para g.age
en la unión a Reservation
, pero se recomienda poner condiciones en el WHERE
cláusula para INNER JOIN
.
Finalmente, completa su 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;
Orden de operaciones
Para esto, escribes tu consulta usando el orden de las operaciones. Entonces, todo lo que está dentro de un paréntesis se ejecuta primero. Al hacerlo de esta manera, comienza escribiendo la consulta contra Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
El siguiente conjunto sería Reservations
, y eso es natural unido:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Finalmente, llegas a la Room
conjunto, de nuevo unido natural:
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;