После написания моих комментариев выше и рассмотрения предлагаемых решений: я думаю, что у меня появилось больше понимания того, что вы пытаетесь сделать.
Предполагая, что в вашей таблице ресурсов имеется неограниченное количество ресурсов, вы хотите выбрать неназначенные ресурсы для каждого сотрудника (на основе их отсутствия для какого-либо конкретного сотрудника в таблице ассоциации ресурсов).
Чтобы выполнить это (и получить исчерпывающий список сотрудников), вам понадобится третья таблица для ссылки на полный список сотрудников. Вам также потребуется CROSS JOIN
всех ресурсов в списке сотрудников (при условии, что каждый сотрудник имеет доступ к каждому ресурсу), а затем вы LEFT JOIN
(LEFT OUTER JOIN
независимо от того) ваш список ассоциаций на запрос, где resource_id
и employee_id
соответствуют resource_id
в таблице resources
и employee_id
в таблице employees
(соответственно). Затем вы добавляете предложение where, которое отфильтровывает все записи, которые назначают сотрудника для ресурса. Это оставляет вас с ресурсами, которые доступны сотруднику, которые они также не подписали. Это запутанно, так что, надеюсь, запрос прольет больше света:
SELECT e.employee_id, e.employee, r.res_id, r.res
FROM employees e
CROSS JOIN resources r
LEFT JOIN assigned_resources ar
ON ar.employee_id = e.employee_id AND r.res_id = ar.res_id
WHERE ar.res_id IS NULL
Если у вас нет таблицы employees
, вы можете сделать то же самое, используя назначенную таблицу ресурсов, но вы будете ограничены выбором сотрудников, которым уже выделены некоторые ресурсы. Вам нужно будет добавить запрос GROUP BY
из-за возможного существования нескольких определений сотрудников в таблице связей. Вот как будет выглядеть этот запрос:
SELECT e.employee_id, r.res_id, r.res
FROM assigned_resources e
CROSS JOIN resources r
LEFT JOIN assigned_resources ar
ON ar.employee_id = e.employee_id AND r.res_id = ar.res_id
WHERE ar.res_id IS NULL
GROUP BY e.employee_id, r.res_id