2011-01-12 33 views
1

(在Oracle数据库SQL查询)选择值

我试图显示基于最高优先级的工作记录的设备ID号(最低数)与工作相关的所有任务。我还需要显示作业的所有任务,因此我不能将查询限制为具有最高优先级的任务。由于最高优先级是1(其次是2,因此等等),查询具有优先级1的任务将始终有效。问题是,有时优先级为1的任务被删除,因此优先级2任务成为最高优先级(不能有重复的优先级,优先级始终为整数)。

下面是一个简单的查询基于对优先级任务拉设备ID时的工作原理:

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的任务,您现在必须找到最低优先级的任务来为该作业分配设备ID。与组的加入我使用子查询研究

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的什么版本?这是一个分层查询,直到11gR2之前,Oracle不支持递归CTE。 – 2011-01-12 22:53:47

+0

Oracle的版本是10gR2 – pablo 2011-01-12 23:10:16

回答

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中这两个级别的子查询的作品,它也可能在甲骨文

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