Вы можете объединяться и объединяться;
select b.bid, b.boatName, avg(s.age) avg_sailor_age
from boat b
inner join reserves r on r.bid = b.bid
inner join sailor s on s.sailorID = r.sailorID
group by b.bid, b.boatName
Если вам нужен только идентификатор судна, а не любая другая информация из таблицы boat
, достаточно 2 объединения:
select r.bid, avg(s.age) avg_sailor_age
from reserves r
inner join sailor s on s.sailorID = r.sailorID
group by r.bid
Примечания:
- в общем, избегайте
natural join
s: они могут вас укусить различными способами - неясно, какова цель предложения
having
вашего существующегозапрос есть;Я оставил это на время.
Редактировать
Если вы хотите фильтровать на лодках, по крайней мере 4 моряка, которыеЗарезервировано это судно имеет возраст более 40 , затем вы можете добавить следующий пункт в конце запроса:
having sum( (s.age >= 40)::int ) >= 4