Ваши оценки независимы и ортогональны, верно? Вы должны иметь одну и ту же таблицу рейтинга, используемую в разных псевдонимах:
from mechanic m
Left Join mechanic_rating mr
On mr.mechanic_id = m.mechanic_id
Left Join rating r_quality
On r_quality.rating_id = mr.quality_id
Left Join rating r_friendly
On r_friendly.rating_id = mr.friendly_id
Left Join rating r_professional
On r_professional.rating_id = mr.professional_id
Объединение их всех, как вы сделали, будет просто отфильтровывать все строки, где независимые рейтинги не все идентичны, что, вероятно, является другой вещью, влияющей на результаты, которые вы видите.
Несмотря на то, что для внешнего ключа это та же таблица, каждый из этих ключей является независимым, поэтому для работы таблицы необходимы «роли».
Однако, поскольку вы не используете никакие столбцы рейтинга в своем списке выбора, вы можете фактически полностью их исключить:
select m.mechanic_id,
m.mechanic_name,
m.city,
m.state,
count(mr.mechanic_id) as num_ratings,
round(avg(mr.quality_id),2) quality_rating
round(avg(mr.friendly_id),2) friendly_rating,
round(avg(mr.professional_id),2) professional_rating
from mechanic m, mechanic_rating mr
where m.mechanic_id in (1)
and m.mechanic_id = mr.mechanic_id
group by mechanic_id
Обратите внимание, что вы также можете исправить старые соединения:
from mechanic m, mechanic_rating mr, rating r_quality, rating r_friendly, rating r_professional
where m.mechanic_id in (1)
and m.mechanic_id = mr.mechanic_id
and mr.quality_id = r_quality.rating_id(+)
and mr.friendly_id = r_friendly.rating_id(+)
and mr.professional_id = r_professional.rating_id(+)
group by mechanic_id