Има няколко начина, по които можете да разгледате това. Първата опция може да е по-лесна, ако сте запознати повече с базите данни, отколкото с релационната алгебра, докато втората ще бъде по-лесна (и по-точна за по-сложни проблеми), ако сте запознати с релационната алгебра.
Първи маси:
Започнете, като разберете вашите присъединявания. Знаете, че имате своите три комплекта (маси) Guest
, Reservation
и Room
, и трите с са естествено свързани (вътрешно свързани). Така че можете да започнете да пишете заявката си така:
SELECT *
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_
INNER JOIN Room r
ON res._roomId_ = r._roomId_;
След като това приключи, приложете вашите условия:
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;
Като алтернатива можете да поставите условието за g.age
в присъединяването към Reservation
, но се препоръчва да поставите условия в WHERE
клауза за INNER JOIN
.
Накрая попълвате своя 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;
Ред на операции
За целта пишете вашата заявка, като използвате реда на операциите. Така че всичко в скоби се изпълнява първо. Правейки го по този начин, започвате с писане на заявката срещу Guest
:
SELECT g._guestId_
FROM Guest g
WHERE g.age < 20;
Следващият набор ще бъде Reservations
, и това е естествено съединено:
SELECT g._guestId_,
res._roomId_
FROM Guest g
INNER JOIN Reservation res
ON g._guestId_ = res._guestId_;
Накрая стигате до Room
набор, отново естествено съединени:
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;