2011-01-12 7 views
1

(SQL-запрос на Oracle DB)выберите значение из присоединяемой таблицы на основе минимального значения в другом столбце

Я пытаюсь показать номер оборудования ИД записи задания на основе наивысшим приоритетом (наименьший номер) всех задач, связанных с работой. Мне также нужно отобразить все задания для задания, поэтому я не могу просто ограничить запрос задачей с наивысшим приоритетом. Поскольку наивысший приоритет равен 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) 

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

+0

Для какой версии Oracle? Это иерархический запрос, и рекурсивные CTE не поддерживались в Oracle до 11gR2. –

+0

Версия Oracle - 10gR2 – pablo

ответ

4

Возможно, что-то вроде этого?

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 
+0

Ваше первое предложение отлично работает (еще не пробовал второй). Благодаря! – pablo

+0

Если кто-нибудь найдет способ сделать это в одном запросе (без подзапроса), используя JOIN или что-то, что было бы здорово! – Francois

Смежные вопросы