Выбор записей из дизайна «многие ко многим» - PullRequest
0 голосов
/ 27 января 2009

Есть три стола, Студенты, Классы, Студент_Класс

Можно ли выбрать учеников, которые не зарегистрированы ни в одном классе, без использования NOT IN?

например. Выберите имя учащегося из класса «Студенты, где ученик НЕ ВХОДИТ» (Выберите «Отличить студента от класса ученика»)

Ответы [ 3 ]

4 голосов
/ 27 января 2009

Я действительно не знаю, почему вы не хотите использовать NOT IN, но вот еще один вариант ...

SELECT Studentname
FROM Students
LEFT JOIN Student_Class ON Student_Class.StudentID = Student.ID
WHERE Student_Class.StudentID IS NULL
3 голосов
/ 27 января 2009

Есть три метода:

  1. SELECT StudentName FROM Students WHERE StudentID NOT IN (SELECT StudentID FROM StudentClass);
  2. SELECT StudentName FROM Students s WHERE NOT EXISTS (SELECT StudentID FROM StudentClass WHERE StudentID = s.StudentID); и
  3. SELECT StudentName FROM Students s LEFT OUTER JOIN StudentClass sc ON s.StudentID = sc.StudentID WHERE sc.StudentID IS NULL).

И я бы не стал использовать (3). Так что выбирай один.

WHERE EXISTS / WHERE NOT EXISTS часто предпочитают IN / NOT IN. Современные оптимизаторы, вероятно, будут оптимизировать (1) и (2), чтобы быть одинаковыми большую часть времени. Стоит сравнить производительность (когда это важно).

0 голосов
/ 27 января 2009
Select studentname from Students s Where s.studentid NOT EXISTS (Select 1 From Student_Class sc where sc.studentid = s.studentid) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...