2011-01-12 8 views
1

(오라클 DB에 대한 SQL 쿼리)값을 선택

내가 가장 높은 우선 순위에 따라 작업 기록에 장비 ID 번호를 표시하기 위해 노력하고있어 (낮은 번호) 작업과 관련된 모든 작업을 표시합니다. 작업의 모든 작업을 표시해야하므로 쿼리를 우선 순위가 가장 높은 작업으로 제한 할 수 없습니다. 가장 높은 우선 순위는 1 (두 번째로 두 번째로 높은 순 위 등)이므로 우선 순위가 1 인 작업을 쿼리하면 항상 작동합니다. 문제는 우선 순위가 1 인 작업이 삭제되는 경우가 있으므로 우선 순위 2 작업이 가장 높은 우선 순위가됩니다 (중복 우선 순위를 가질 수없고 우선 순위는 항상 정수임).

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 

: 그것은 3 개 작업이있는 경우

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 

위의 쿼리는 다음과 같은 결과를 얻을 것이다 : 여기

우선 순위 1 작업에 따라 장비 ID를 당길 때 작동하는 샘플 쿼리입니다 그러나 우선 순위가 1 인 작업이 작업에서 삭제 된 경우 이제 작업에 장비 ID를 할당하는 가장 낮은 우선 순위의 작업을 찾아야합니다. 는 A 그룹과 조인

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

오라클에서 작동 할 수있다? 이것은 계층 적 쿼리이므로 11gR2까지 Oracle에서는 재귀 CTE가 지원되지 않습니다. –

+0

오라클의 버전은 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의이 두 가지 수준의 하위 쿼리의 작품, 그것은 또한 오라클의 버전을 들어

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

관련 문제