Existem algumas maneiras que você pode olhar para isso. A primeira opção pode ser mais fácil se você estiver mais familiarizado com bancos de dados do que com álgebra relacional, enquanto a segunda será mais fácil (e mais precisa para problemas mais complexos) se estiver familiarizado com álgebra relacional.
Primeiro as tabelas:
Comece descobrindo suas junções. Você sabe que tem seus três conjuntos (tabelas)
Guest
, Reservation
, e Room
, todos os três com são unidos naturalmente (unidos internamente). Então você pode começar a escrever sua consulta assim:SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
Feito isso, aplique suas condições:
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, você pode colocar a condição para
g.age
na junção a Reservation
, mas é recomendado colocar condições no WHERE
cláusula para INNER JOIN
. Por fim, você preenche seu
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;
Ordem das operações
Para isso, você escreve sua consulta usando a ordem das operações. Então, tudo dentro de um parêntese é executado primeiro. Fazendo isso, você começa escrevendo a consulta em
Guest
:SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
O próximo conjunto seria
Reservations
, e isso é natural junto:SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Finalmente, você chega à
Room
set, novamente natural juntou: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;