3

私は3つのテーブルを持っています。以下は構造です。

  • student( id int, name varchar(20))
  • course( course_id int, subject varchar(10))
  • student_course( st_id int, course_id int) -> コースに登録した学生の名前を含む

ここで、どのコースにも登録していない学生を見つけるためのクエリを書きたいと思います。私が理解できるように、この情報を取得するには複数の方法があります。これらのうちどれが最も効率的か、またその理由を教えてください。また、同じことを実行するための他のより良い方法があれば、私に知らせてください。

db2 => select distinct name from student inner join student_course on id not in (select st_id from student_course)

db2 => select name from student minus (select name from student inner join student_course on id=st_id)

db2 => select name from student where id not in (select st_id from student_course)

前もって感謝します!!

4

4 に答える 4

9

使用するサブクエリは、それがnot inであろうとなかろminusうと、一般的に非効率的です。これを行う一般的な方法は次のleft joinとおりです。

select name 
from student 
left join student_course on id = st_id
where st_id is NULL

使用joinは「通常の」推奨ソリューションです。

于 2013-06-29T12:46:23.517 に答える
0

「not in」を使用すると、一般的に遅くなります。これにより、2 番目のクエリが最も効率的になります。ただし、ブラケットはおそらく必要ありません。

于 2013-06-29T12:42:29.480 に答える
0

コメントとして: 名前ではなく学生 ID (一意) を選択することをお勧めします。

別のクエリ オプションとして、count(course_id) = 0 を持つ、student_id、count(course_id) でグループ化して、2 つのテーブルを結合することができます。

また、インデックスがより重要になることに同意します。

于 2013-06-29T12:54:16.597 に答える