как отладить этот запрос - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу написать запрос, который должен дать мне boat_id и среднее значение возраста моряка этой лодки. это схема базы данных:

BOAT(bid , boatNAME ,color)
SAILOR(sailorID , sailorNAME , age , rating)
RESERVES(sailorID , bid , date) 
select bid,avg(select sailors.age from sailors natural join reserves)  
from reserves natural join sailors
group by bid
having count(select age from sailors natural join reserves where age>40)>4

выдает ошибку при выборе, который я написал в avg ()

1 Ответ

0 голосов
/ 01 ноября 2019

Вы можете объединяться и объединяться;

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...