Что такое оператор SQL, который может найти все классы, в которых еще не зарегистрирован учащийся? - PullRequest
0 голосов
/ 23 апреля 2010

Скажем, в типичной системе баз данных университета, что может быть оператором SQL, который может найти все классы, в которых еще не зарегистрировано ни одного студента?(когда процесс регистрации длится 10 дней, а сейчас третий день).

Какие могут быть другие решения SQL-операторов?

Подробности:

Предполагается, что в университете многоФакультеты, и каждый Факультет с различными классами, такими как Психология 1А, преподаваемая несколькими разными учителями в разное время, и Психология 10, Математика 110 и т. Д.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

Существуют базовые методы идентификации записей в таблице A, которых нет в таблице B. У каждого есть свои достоинства, и каждый может работать хорошо или плохо, в зависимости от распределения данных и объема. Кроме того, наличие нулей в столбцах фильтрации может привести к различным результатам (хотя это кажется маловероятным, что это учитывается в конкретном сценарии, описанном в вопросе). Наконец, не все разновидности SQL будут поддерживать все эти синтаксисы.

Самый строгий, вероятно, NOT IN:

select *  
from   classes 
where id not in 
        (  select class_id 
           from registrations 
        ) 
/

Следующее связано НЕ СУЩЕСТВУЕТ:

select *  
from   classes 
where not exists 
        (  select null
           from registrations 
           where registrations.class_id = classes.id
        ) 
/

Тогда есть АНТИ-СОЕДИНЕНИЕ:

select *  
from classes 
     full outer join registrations 
            on (classes.id = registrations.class_id )
where registrations.class_id is null 
/

Наконец, есть оператор МИНУС:

select id  
from classes 
minus
select class_id 
from registrations
/

Этот окончательный синтаксис достаточно быстр для написания, но, очевидно, в деталях. Если нам нужно больше столбцов из CLASSES, столбцов, которых нет в REGISTRATIONS, то нам нужно передать их как подзапрос для выбора в CLASSES. Таким образом, он не так широко применим, как другие синтаксисы, но иногда полезен.

2 голосов
/ 23 апреля 2010

Вот один вариант использования FULL OUTER JOIN:

SELECT * 
FROM Class
  FULL OUTER JOIN StudentClass
   ON Class.Id = StudentClass.ClassId
WHERE StudentClass.ClassId IS NULL

Вы также можете использовать подзапрос с NOT IN:

SELECT * 
FROM Class
WHERE Id NOT IN
(  SELECT ClassId
   FROM StudentClass
)
1 голос
/ 23 апреля 2010

Вы можете использовать левое соединение, которое вставляется в NULL, когда нечего присоединиться

SELECT class
FROM classes c
    LEFT JOIN students s ON c.class = s.class
WHERE s.name IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...