根据不同列中的最低值从连接表中选择值

时间:2011-01-12 22:47:17

标签: sql oracle greatest-n-per-group

(Oracle DB上的SQL查询)

我正在尝试根据与作业关联的所有任务的最高优先级(最低编号)在作业记录上显示设备ID编号。我还需要显示作业的所有任务,因此我不能简单地将查询限制为具有最高优先级的任务。由于最高优先级为1(其中2为第二高等等),因此查询优先级为1的任务始终有效。问题是有时优先级为1的任务会被删除,因此优先级2任务成为最高优先级(您不能拥有重复的优先级,优先级始终是整数)。

以下是基于优先级1任务提取设备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)

我研究了使用组函数在连接中使用子查询,但似乎永远不会找到一个适合我想要完成的工作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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