выберите значение из объединенной таблицы на основе самого низкого значения в другом столбце - PullRequest
1 голос
/ 13 января 2011

(SQL-запрос к базе данных Oracle)

Я пытаюсь отобразить номер идентификатора оборудования в записи задания на основе наивысшего приоритета (наименьшего числа) среди всех заданий, связанных с заданием. Мне также нужно отобразить все задачи для задания, поэтому я не могу просто ограничить запрос задачей с наивысшим приоритетом. Поскольку наивысшим приоритетом является 1 (с 2-м на втором месте и т. Д.), Запрос для задачи с приоритетом 1 всегда будет работать. Проблема заключается в том, что иногда задача с приоритетом 1 удаляется, и поэтому задача с приоритетом 2 становится наивысшим приоритетом (нельзя иметь дублирующиеся приоритеты, а приоритет всегда является целым числом).

Вот пример запроса, который работает при извлечении идентификатора оборудования на основе задачи приоритета 1:

   SELECT j.title, 
          j.jobnum,  
          a.eqid, 
          a.prior, 
          a.desc, 
          b.eqid peqid  
     FROM JOB j  
LEFT JOIN TASK a ON a.jobnum = j.jobnum
LEFT JOIN TASK b ON b.jobnum = j.jobnum
                AND b.prior = 1
    WHERE j.jobnum = '123'
 ORDER BY a.prior 

Приведенный выше запрос даст следующие результаты, если он имеет 3 задачи:

TITLE   JOBNUM   EQID   PRIOR   DESC            PEQID
newjob  123      HAQ7   1       fix this        HAQ7
newjob  123      PDL    2       clean this      HAQ7
newjob  123      ACCH   3       move this       HAQ7

Однако, если задача с приоритетом 1 удалена из задания, теперь вы должны найти задачу с самым низким приоритетом, чтобы назначить заданию идентификатор оборудования.

Я пытался по существу что-то сделать в этом духе, но это не работает (выдает сообщение, что групповая функция здесь не разрешена):

select job.title, job.jobnum, task.eqid, task.prior, task.desc, tp.eqid peqid  
from job  
left join task on job.jobnum = task.jobnum  
left join task tp on job.jobnum = tp.jobnum  
   and tp.prior = min(tp.prior)

Я исследовал использование подзапроса в объединении с групповой функцией, но, похоже, никогда не смог найти тот, который подходит для того, что я пытаюсь выполнить. Любая помощь будет принята с благодарностью.

1 Ответ

4 голосов
/ 13 января 2011

Может как то так?

select job.title, job.jobnum, task.eqid, task.prior, task.desc, tp.eqid peqid  
from job  
left join task on job.jobnum = task.jobnum  
left join (
    select jobnum, MIN(prior) prior
    from task
    group by jobnum) m on m.jobnum = job.jobnum
left join task tp on m.jobnum = tp.jobnum and m.prior = tp.prior
where job.jobnum = '123'
order by task.prior asc

Этот двухуровневый подзапрос работает в SQL Server, он также может работать в Oracle

select job.title, job.jobnum, task.eqid, task.prior, task.desc,
    (select tp2.eqid from task tp2
     where tp2.jobnum=job.jobnum and tp2.prior =
        (select MIN(tp.prior) from task tp
         where tp.jobnum=job.jobnum)) peqid
from job  
left join task on job.jobnum = task.jobnum  
where job.jobnum = '123'
order by task.prior asc
...