Конкретный ответ на ваш вопрос заключается в том, что Oracle должен оценивать подзапрос только один раз.
Однако ваш запрос сформулирован с ненужными подзапросами. Вы можете начать с:
select z.*, a.name, a.id, a.type
from TableZ z join
TableA a
on z.id = a.id
where a.type in (select b.type from TableB b where b.color = 'red');
Это вряд ли повлияет на производительность, но упрощает то, что вы делаете. Далее, TableB
не имеет дубликатов значений, поэтому я бы предложил:
select z.*, a.name, a.id, a.type
from TableZ z join
TableA a
on z.id = a.id left join
TableB b
on b.type = a.type
where b.color = 'red' or a.type is null;
Фраза запроса как join
часто дает оптимизатору больший выбор - а больший выбор часто означает более быстрые запросы.