sql >> データベース >  >> RDS >> Oracle

サブクエリ-最高のスコアを取得する

    従来の方法は、分析 です。 MAX() (または他の分析関数):

    select *
      from ( select s.student_id
                  , w.last_name
                  , w.first_name
                  , s.numeric_grade
                  , max(s.numeric_grade) over () as numeric_final_grade
               from grade s
               join section z
                 on s.section_id = z.section_id
               join student w
                 on s.student_id = w.student_id
              where z.course_no = 230 
                and z.section_id = 100 
                and s.grade_type_code = 'FI'
                    )
     where numeric_grade = numeric_final_grade
    

    しかし、私はおそらくFIRST を使用したいと思います。 (KEEP)。

    select max(s.student_id) keep (dense_rank first order by s.numeric_grade desc) as student_id
         , max(w.last_name) keep (dense_rank first order by s.numeric_grade desc) as last_name
         , max(w.first_name) keep (dense_rank first order by s.numeric_grade desc) as first_na,e
         , max(s.numeric_grade_name) as numeric_final_grade
      from grade s
      join section z
        on s.section_id = z.section_id
      join student w
        on s.student_id = w.student_id
     where z.course_no = 230 
       and z.section_id = 100 
       and s.grade_type_code = 'FI'
    

    最初に提案したものに対するこれらのアプローチの両方の利点は、テーブルを1回スキャンするだけであり、テーブルまたはインデックスにもう一度アクセスする必要がないことです。 RobvanWijkのブログ投稿 を強くお勧めします。 2つの違いについて。

    追伸これらは異なる結果を返すため、わずかに異なります。分析関数は、2人の学生が同じ最大スコアを持つ重複を維持します(これはあなたの提案も同様に行います)。集計関数は重複を削除し、同点の場合はランダムなレコードを返します。



    1. jsp jstlsqlmysqlのように奇妙な動作

    2. 特定の日付範囲のMySQLクエリ

    3. SQL結合チュートリアル

    4. 操作'concat'の照合の不正な組み合わせ