Można na to spojrzeć na kilka sposobów. Pierwsza opcja może być łatwiejsza, jeśli jesteś bardziej zaznajomiony z bazami danych niż z algebrą relacyjną, podczas gdy druga będzie łatwiejsza (i dokładniejsza w przypadku bardziej złożonych problemów), jeśli znasz algebrę relacyjną.
Najpierw tabele:
Zacznij od ustalenia swoich sprzężeń. Wiesz, że masz swoje trzy zestawy (stoły) Guest
, Reservation
i Room
, wszystkie trzy z są połączone w sposób naturalny (połączone wewnętrzne). Możesz więc zacząć pisać zapytanie w ten sposób:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
Po zakończeniu zastosuj swoje warunki:
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;
Alternatywnie możesz umieścić warunek dla g.age
w dołączeniu do Reservation
, ale zaleca się umieszczenie warunków w WHERE
klauzula INNER JOIN
.
Na koniec wypełniasz swój 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;
Kolejność operacji
W tym celu piszesz zapytanie, używając kolejności operacji. Więc wszystko w nawiasie jest wykonywane jako pierwsze. Robiąc to w ten sposób, zaczynasz od napisania zapytania do Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
Następny zestaw to Reservations
, i to jest naturalne połączone:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Wreszcie trafiasz do Room
zestaw, ponownie naturalny połączony:
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;