Если вы хотите разрешить связи, вы можете использовать оконную функцию rank()
:
select *
from (
select
co.companyID,
ca.categoryID,
count(*) NumberOfMovies,
rank() over(partition by c.categoryID order by count(*) desc) rn
from movie m
inner join categoryFilm cf on cf.movieID = m.movieID
inner join category ca on ca.categoryID = cf.categoryID
inner join company co on co.companyID = m.companyID
group by co.companyID, ca.categoryID
) t
where rn = 1
order by ca.categoryID
Это дает вам лучшую компанию для каждой категории, включая связи. Если вы хотите выполнить фильтрацию по данной категории, вы можете просто добавить предложение where
во внутренний запрос.
Примечание: не используйте natural join
s: они подвержены ошибкам. Я переписал запрос, чтобы использовать вместо него inner join
s (я сделал несколько предположений об отношениях).