Получить все объекты таблицы_1, которые
иметь конкретную запись (А) и не
есть другая конкретная запись (B)
связаны, т.е. получают все объекты
Table_1, которые имеют сущность Table_2
с именем = p1 и не имеет сущности
таблицы_2 с именем = p2 связано.
У меня возникли проблемы с пониманием ваших критериев, но я думаю, что это то, что вы хотите:
SELECT *
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.t1_id
WHERE t2.name = 'p1'
AND NOT EXISTS(SELECT 'x' FROM Table2 t2_2 WHERE t1.ID = t2_2.t1_id AND t2_2.name = 'p2')
Это даст вам все из Таблицы 1, в которой есть совпадающая запись в Таблице 2 с именем = 'p1', и НЕ СУЩЕСТВУЕТ соответствующая запись в Таблице 2 с именем = 'p2'. Это то, что вам нужно?
ИЗМЕНИТЬ СНОВА:
Я подумал о более разумном способе сделать это, который включает статический (некоррелированный) подзапрос. Этот подзапрос будет выполняться только один раз, а не один раз для каждой родительской строки в таблице Table1. Я не проводил этот код через анализатор запросов, но он должен быть значительно быстрее, чем запросы, использующие EXISTS (...)
SELECT *
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.t1_id
WHERE t2.name = 'p1'
AND t1.id NOT IN(SELECT t1_id FROM Table2 WHERE name = 'p2')