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;