Поскольку вы не выбираете имя своего ученого (считаете только их миссии), вам не нужно объединять эти таблицы в подзапросе.Группировка по внешнему ключу была бы достаточной:
select count(numis) from mission group by nums
Ваши имена столбцов немного странные, но это ваш выбор; -)
Можно выбрать только ученого с наибольшим количеством ссылок на миссиидвумя способами.Одним из подходов может быть ваш подход, когда вы можете получить несколько ученых, если у них одинаковые максимальные миссии.
Первая проблема, с которой вы столкнулись в своем запросе, заключается в том, что вы проверяете агрегацию (HAVING COUNT (*) =) безгруппировка.Вы только группируете свой подвыбор.
Во-вторых, вы не можете агрегировать агрегацию (MAX (COUNT)), но вы можете выбрать только первую строку этого подбора, упорядоченную по его размеру, или выбрать максимум из этого, выполнив запросподзапрос.
Подход только с одной строкой:
select s.name from scientist s, mission m
where m.nums = s.nums
group by name
having count(*) =
(select count(numis) from mission
group by nums
order by 1 desc
fetch first 1 row only)
Подход с двойным подзапросом:
select s.name from scientist s, mission m
where m.nums = s.nums
group by name having count(*) =
(select max(numis) from
(select count(numis) numis from mission group by nums)
)
Второй подход заключается в выполнении FETCH FIRST для вашего конечного результатано это даст вам ровно 1 ученого, даже если есть несколько с одинаковыми максимальными миссиями:
select s.name from scientist s, mission m
where m.nums = s.nums
group by name
order by count(*) desc
fetch first 1 row only
Выполнение картезианского продукта не является современным, но оптимизатор сделает его "хорошим соединением" суказанная ссылка в предложении where.
Сделано в IBM Db2, но также должно работать в Oracle.