1

私は来週、データベースについて実践的な大学を持っています。大学のスキームを中心に15個のクエリを作成する必要があります。これは次のようになります。

  • Student(Student_No、First_Name、Last_Name、Sex、Date-Of-Birth、Address、Level、Degree_Code)
  • Degree(Degree_Code、Degree_Name、School_Name)
  • Module(Module_Code、Module_Title、School_Name)
  • 学校(School_Name、Faculty、Head-of-School)
  • Take_Exam(Student_No、Module_Code、Mark)

14のクエリを完了しましたが、これに固執しています。

  • すべてのモジュールを受講する学生の名前を取得します。(ヒント使用は存在しません)。

私は存在しないクエリを読んでいますが、どこから始めればよいのかさえわかりません!私はこのコードを作成しました:

select students.student_no, fname, lname, count(module_code)
from students left join take_exam using (student_no)
group by student_no
having count(module_code) < 19
order by lname;

これにより、19のモジュールすべてを受講しないすべての学生が返されます。ただし、コードが19未満であるため、コードが嫌いです。つまり、モジュールの数が後で変更された場合、この値を変更する必要があり、非効率的です。

誰かが私を正しい方向に向けて、「存在しない」クエリの使用に関するガイダンスを教えてもらえますか?

ありがとう、アンドリュー

4

3 に答える 3

1

宿題に完全に答えることなく、役立つヒントを次に示します。

別の角度から見てみてください。すべてのモジュールの質問に回答した学生には、モジュールテーブルへの左結合を持つnullフィールドはありません。

table_examまた、学生だけが試験を受けたいので、おそらく左外側の結合は必要ありません...。

于 2012-10-28T16:15:47.493 に答える
1

使用not exists

select *
from Student s1 
where not exists 
         (select 1 
          from Module 
          where Module_Code not in
                      (select Module_Code 
                       from Take_Exam 
                       where Student_No = s1.Student_No)

説明 :

sテーブル内の各学生について、結果にStudent追加します。ただし、このモジュールがテーブル内の学生にマップされないように、テーブル内にモジュールが存在しない場合。sModulesTake_Exam

直感的ではありませんが、「すべてのモジュールを受講するすべての学生」とまったく同じです。

于 2012-10-28T16:24:54.920 に答える
0

私は、あなたはdistinct count of modules from module tableそれを取得して、例えば以下のように比較して使用することができると思います:

     select students.student_no, fname, lname, count(t.module_code)
     from module m, students join take_exam t using (student_no)
     group by student_no
     having count(t.module_code) = count(distinct(m.module_code)) 
     order by lname;

注意:学生にすべてのモジュールを受講してもらいたいので=、条件をに変更して参加しinner joinました。

編集:notExitの使用:

     select students.student_no, fname, lname 
     from students 
     WHERE  NOT EXISTS (select *
                from module m, students join take_exam t using (student_no)
                group by student_no
                having count(t.module_code) < count(distinct(m.module_code)) 
                group by student_no
             )
     order by lname;
于 2012-10-28T16:16:47.677 に答える