Я пишу запрос, чтобы исключить определенную группу сотрудников из таблицы.Допустим, у меня есть таблица 1 ,action_details, в которой есть информация, которую я хочу выбрать.Таблица 2 employee_task_associations отображает каждого сотрудника в задачу, для которой он был назначен в определенный день.У него есть поле для employee_id и поле с именем map_id, которое является идентификатором различных задач.Эта таблица является ассоциативной, поэтому таблицы 1 и 3 могут иметь отношение «многие ко многим».Таблица 3 employee_tasks содержит список всех задач, которые может выполнять сотрудник.
Я написал этот запрос, который работает, но не оптимизирован:
SELECT someInfo FROM transaction_details TD
WHERE TD.employee_id NOT IN
(SELECT employee_id from employee_task_associations ETA
WHERE map_id IN
(SELECT id FROM employee_tasks ET
WHERE ET.taskName = "The task I want to exclude"))
Пока это работает,он будет выполнять несколько запросов.Я хочу ускорить процесс, заменив мои вложенные операторы NOT IN и IN на JOINS.
Я знаю, что могу заменить нижние четыре строки следующим:
SELECT employee_id FROM employee_task_assocations ETA
LEFT OUTER JOIN employee_tasks ET
ON ETA.map_id = ET.id
WHERE ET.taskName = "The task I want to exclude"
Это вернетсписок всех идентификаторов сотрудников, которые выполнили эту задачу.Я хочу исключить их из моего оператора SELECT из транзакции за счет использования JOIN вместо подзапроса.Я попытался с помощью LEFT OUTER JOIN WHERE ETA.id NULL, но это не работает.Как я могу использовать JOIN для исключения определенных сотрудников в этом случае?