Это также будет работать:
SELECT p_id
FROM mz_t_services
WHERE NOT EXISTS
( SELECT 1
FROM mz_t_naznexec
WHERE mz_t_naznexec.p_services = mz_t_services.p_id
)
Я предпочитаю его вышеуказанным решениям, потому что он более надежно использует индексы (по моему опыту). Он работает независимо от того, присутствуют ли значения NULL или нет, поэтому вы можете просто использовать эту форму все время, независимо от ваших ожиданий относительно содержимого таблицы, и не беспокоиться о том, что люди спрашивают вас, почему вы проверяете значения NULL в столбце, который не Позвольте им.
В любом случае, вам следует попробовать оба решения и посмотреть, какое из них лучше для вас.