2011-01-12 1 views
1

(Oracle DBのSQLクエリ)異なる列の最小値に基づいて結合テーブルから値を選択

最高の優先度(最低の数値)に基づいてジョブレコードに機器ID番号を表示しようとしていますが、ジョブに関連するすべてのタスクのまた、ジョブのすべてのタスクを表示する必要があるため、クエリを最も優先度の高いタスクに限定するだけでは不十分です。最高のプライオリティは1(2番目のプライオリティが2番目に高くなるなど)であるため、優先度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を割り当てる優先度の最も低いタスクを見つける必要があります。グループに参加して

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でこの2レベルのサブクエリの作品、それはまた、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

あなたの最初の提案は素晴らしいです(まだ2つ目は試していません)。ありがとう! – pablo

+0

誰かがJOINなどを使って(サブクエリなしで)単一のクエリでそれを行う方法を見つけた場合、それは素晴らしいでしょう! – Francois

関連する問題