Как найти наибольшее количество результатов с использованием нескольких таблиц в SQL (Oracle) - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть четыре стола.Вот скелеты ...

ACADEMIC_TBL
    academic_id
    academic_name


AFFILIATION_TBL
    academic_id*
    institution_id*
    joined_date
    leave_date

INSTITUTION_TBL
    institution_id
    institution_name

REVIEW_TBL
    academic_id*
    institution_id*
    date_posted
    review_score

Используя эти таблицы, мне нужно найти академика (с указанием его имени, а не ID) с наибольшим количеством отзывов и названием учреждения (не ID), которым они являются в настоящее время.связан с.Я полагаю, что это нужно будет сделать, используя несколько сценариев под-выбора, но у меня возникают проблемы с выяснением, как его структурировать.

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

это будет работать:

SELECT   at.academic_name, 
         it.institution_name, 
         Max(rt.review_score), 
from     academic_tbl at, 
         affiliation_tbl afft, 
         institution_tbl it, 
         review_tbl rt 
WHERE    AT.academic_id=afft.academic_id 
AND      afft.institution_id=it.institution_id 
AND      afft.academic_id=rt.academic_id 
GROUP BY at.academia_name,it.instituton_id
0 голосов
/ 09 декабря 2018

Попробуйте это:

select
       inst.institution_name
     , aca.academic_name
from
       academic_tbl    aca
     , institution_tbl inst
     , affiliation_tbl aff
     , review_tbl      rev
     , (
              select
                     max(rt.review_score) max_score
              from
                     review_tbl      rt
                   , affiliation_tbl aff_inn
              where
                     rt.date_posted     >= aff_inn.join_date
                     and rt.date_posted <= aff_inn.leave_date
                     and rt.academic_id = aff_inn.academic_id
                     and rt.institution_id  = aff_inn.institution_id
       )
       agg
where
       aca.academic_id         = inst.academic_id
       and inst.institution_id = aff.institution_id
       and aff.institution_id  = rev.institution_id
       and aff.academic_id     = rev.academic_id
       and rev.date_posted    >= aff.join_date
       and rev.date_posted    <= aff.leave_date
       and rev.review_score    = agg.max_score
;

Может быть возвращено более одного академика, если есть больше с таким же количеством баллов (максимум).

0 голосов
/ 09 декабря 2018

Вам необходим агрегированный запрос, который объединяет все 4 таблицы, чтобы подсчитать, сколько обзоров было выполнено каждым академиком.

Запрос:

SELECT
    inst.institution_name, 
    aca.academic_name, 
    COUNT(*)
FROM
    academic_tbl aca
    INNER JOIN affiliation_tbl aff ON aff.academic_id = aca.academic_id
    INNER JOIN institution_tbl inst ON inst.institution_id = aff.institution_id
    INNER JOIN review_tbl rev ON rev.academic_id = aca.academic_id AND rev.institution_id = aff.institution_id
GROUP BY
    inst.institution_name, 
    aca.academic_name,
    inst.institution_id, 
    aca.academic_id

Примечание:

  • добавил идентификатор академии и учреждения в предложение GROUP BY, чтобы предотвратить объединение (ошибочно) потенциальных академиков или учреждений с одинаковым названием

  • , если один и тот же академик выполнилВ обзорах для разных учреждений вы найдете по одной строке для каждой пары академика / институт, что, если я правильно вас понял, это то, что вы хотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...