Еще одна опция, которую можно прочитать как двойной минус:
Показать все товары, для которых нет категории (3,4,5), для которых нет соответствия этому товару.
SELECT p.id
FROM PRODUCTS p
WHERE NOT EXISTS
( SELECT *
FROM CATEGORIES c
WHERE c.id IN (3,4,5)
AND NOT EXISTS
( SELECT *
FROM PRODUCTS_CATEGORIES pc
WHERE pc.product_id = p.id
AND pc.category_id = c.id
)
)
Это широко известно как деление Даты .