Я обычно предпочитаю подход group by
для этих типов проблем.Но если производительность является проблемой, то это может быть быстрее с правильными индексами:
select t.name
from t
where t.code = 'da014' and
not exists (select 1 from t t2 where t2.name = t.name and t2.code = 'sd02');
В частности, вы хотите индексы на t(code, name)
и t(name, code)
- один для внешнего запроса и одинпредназначен для подзапроса.
Если вы используете group by
, то фильтрация перед агрегацией может повысить производительность:
select t.name
from t
where t.code in ('da014', 'sd02')
group by t.name
having sum(t.code = 'sd02') = 0;
Вам нужно только проверить 'sd02'
.Если его там нет, то name
должен иметь другой код для обработки group by
.