Существуют базовые методы идентификации записей в таблице 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. Таким образом, он не так широко применим, как другие синтаксисы, но иногда полезен.