Я бы начал с чего-то вроде:
SELECT EmpID, COUNT(*) AS NumDepts
FROM thetable
WHERE DeptID IN (1, 2, 3)
GROUP BY EmpId
HAVING COUNT(*) == 3
Конечно, 3 в последней строке всегда будет длиной последовательности идентификаторов отделов, которые вы проверяете (поэтому для (2,3,4,5,6,7)
это будет 6). Это один из естественных способов выразить «сотрудников, связанных со всеми этими отделами».
Edit: я вижу примечание в другом ответе о проблемах производительности - я попробовал этот подход в SQLite и PostgreSQL, с соответствующими индексами, и там, похоже, он работает хорошо и с соответствующим использованием всех указанных индексов; и в MySQL 5.0, где я должен признать, производительность была нигде не так хороша.
Я подозреваю (без возможности сравнить это с еще миллионами движков ;-), что другие действительно хорошие движки SQL (такие как SQL Server 2008, Oracle, IBM DB2, новый с открытым исходным кодом Ingres ...) также будут хорошо оптимизировать этот запрос, в то время как другие посредственные (не могу придумать ни одного из них с популярностью, близкой к MySQL) не будут.
Так что, без сомнения, ваш любимый ответ будет зависеть от того, какие движки вам действительно нужны (это возвращает меня к тому времени, более десяти лет назад, когда в мои обязанности входило управление командой, которая поддерживала компонент, который должен был обеспечивать -производить запросы более чем с полудюжины разрозненных движков - говорить о ночных кошмарах ...! -).