Преобразование SQL в реляционную алгебру - что делать дальше?

Я пытаюсь преобразовать команду SQL в реляционную алгебру. Главная проблема заключается в том, что существует SQL-оператор NOT IN, который не находится в реляционной алгебре.

Мой запрос сделал это:

Выберите идентификатор сотрудника, фамилию и training_id (из обучения) из сотрудников, которые прошли обучение в этом квартале, но не имеют всех предпосылок для этого обучения, поэтому они никогда не проходили обучение по предварительным требованиям.

Если результат заканчивается X, это означает, что он не был завершен успешно.

ТАБЛИЦЫ:

employee(employee_id, first_name, last_name)
training(training_id, quartal, year, name)
enrollment(employee_id, training_id, quartal, year, result)
prerequisity(training_id, prerequisity_id)

Мой SQL-запрос:

select e.employee_id, lastname, training_id from employee as e NATURAL JOIN enrollment NATURAL JOIN training NATURAL JOIN prerequisity WHERE quartal = 'first' and year = '2016'  and training_id NOT IN (select e.training_id from enrollment as e NATURAL JOIN employee as ee where e.employee_id=ee.employee_id and result not like '%X' and result is not NULL)

Вероятно, это правильный SQL, поэтому теперь я собираюсь преобразовать его в реляционную алгебру:

PROJECT[employee_id,lastname, training_id](SELECT[quartal='first',year='2016'](employee@enrollment@training@prerequisity)) # here is the problem

Как смоделировать команду "НЕ В" в РА?

1 ответ

Я предлагаю вам использовать Set Difference (−)

Результатом операции установки разности являются кортежи, которые присутствуют в одном отношении, но не во втором.

PROJECT[employee_id,lastname, training_id](SELECT[quartal='first',year='2016']
    (employee@enrollment@training@prerequisity))  - (PROJECT training_id ....
Другие вопросы по тегам