0

Oracle 9.2.0.8 では、別のフィールド (WO_NUM) ごとに、特定のフィールド (LAB_SEQ) が最大 (順次 VARCHAR 配列 '0001'、'0002' など) であるレコード セットを返す必要があります。 . 最大を選択するために、降順で並べ替えて最初の行を選択しようとしています。私が StackOverflow で見つけることができるものはすべて、これを行う唯一の方法は相関サブクエリを使用することであることを示唆しています。次に、外側のクエリの WHERE 句でこの最大値を使用して、各 WO_NUM に必要な行を取得します。

SELECT lt.WO_NUM, lt.EMP_NUM, lt.LAB_END_DATE, lt.LAB_END_TIME
FROM LAB_TIM lt WHERE lt.LAB_SEQ = (
   SELECT LAB_SEQ FROM (
      SELECT lab.LAB_SEQ FROM LAB_TIM lab WHERE lab.CCN='1' AND MAS_LOC='1'
          AND lt.WO_NUM = lab.WO_NUM ORDER BY ROWNUM DESC
   ) WHERE ROWNUM=1
)

ただし、これは lt.WO_NUM エラーに対して無効な識別子を返します。調査によると、ORAcle 8 では 1 レベルの深さの相関サブクエリのみが許可され、サブクエリを回避するために書き直すことが提案されています。このステートメントを実行するための助けをいただければ幸いです。

4

2 に答える 2

3

相関サブクエリは次のようにする必要があります

SELECT lt.WO_NUM, lt.EMP_NUM, lt.LAB_END_DATE, lt.LAB_END_TIME
FROM LAB_TIM lt WHERE lt.LAB_SEQ = (
   SELECT max(lab.LAB_SEQ)
     FROM LAB_TIM lab 
    WHERE lab.CCN='1' AND MAS_LOC='1'
      AND lt.WO_NUM = lab.WO_NUM 
  )

Oracle 9.2 を使用しているため、おそらく相関サブクエリを使用する方が効率的です。現在のクエリで述語lab.CCN='1' AND MAS_LOC='1'が何をしているのかわからないので、それらを分析関数アプローチに変換する方法がよくわかりません。と の組み合わせはLAB_SEQWO_NUM一意LAB_TIMですか? すべての に対して単一の一意の行を取得するために、CCNとの述語を追加する必要がありますか? または、これらの述語を使用して、出力の行数を減らしていますか? 基本的なアプローチは次のようになりますMAS_LOCWO_NUM

SELECT *
  FROM (SELECT lt.WO_NUM, 
               lt.EMP_NUM, 
               lt.LAB_END_DATE, 
               lt.LAB_END_TIME,
               rank() over (partition by wo_num
                                order by lab_seq desc) rnk
          FROM LAB_TIM lt)
   WHERE rnk = 1

しかし、分析関数の句に追加する必要があるかどうか、または句にCCN追加MAS_LOCする必要があるかどうかは明確ではありません。ORDER BYWHERE

于 2012-05-23T15:19:13.437 に答える
0

これは、特にテーブルにインデックスがある場合に、相関サブクエリが優れているケースの 1 つです。ただし、相関サブクエリを結合として書き直すことは可能です。

相関サブクエリなしで、以下は同等だと思います:

SELECT lt.WO_NUM, lt.EMP_NUM, lt.LAB_END_DATE, lt.LAB_END_TIME
FROM (select *, rownum as r
      from LAB_TIM lt
     ) lt join
     (select wo_num, max(r) as maxrownum
      from (select LAB_SEQ, wo_num, rownum as r
            from LAB_TIM lt
            where lab.CCN = '1' AND MAS_LOC = '1'
           ) 
     ) ltsum
     on lt.wo_num = ltsum.wo_num and
        lt.r = ltsum.maxrownum

Oracle が ORDER BY などで行番号をどのように処理するかについては、少しわかりません。

于 2012-05-23T15:35:58.660 に答える