(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)
我研究了使用组函数在连接中使用子查询,但似乎永远不会找到一个适合我想要完成的工作。任何帮助将不胜感激。
答案 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