Вы можете попробовать использовать подсказку / * + MATERIALIZE * / в списке faculty_list с подзапросом предложения. В целом, я бы сказал, что производительность будет в основном зависеть от того, будет ли проиндексирован student.faculty_code, вы можете добавить к этому индексу оценку
create index student_fac_grade_idx on student (fac_code, grade);
Если у вас есть этот индекс и материализованный хинг, то у вас есть Оптимальный шанс этого хорошо работает. Следующее работает и для нулевого списка ввода:
with in_list as
(
select '101,102,104,108,201,202,204,208,301,402,504,608' in_list from dual
--select '' in_list from dual
)
, faculty_list as
(
SELECT /*+ MATERIALIZE */ REGEXP_SUBSTR(in_list,'[^,]+',1,LEVEL) AS FAC_CODE
FROM DUAL , in_list
CONNECT BY LEVEL <=LENGTH (REGEXP_REPLACE(in_list,'[^,]+'))+1
)
--select * from faculty_list ;
, student as
(
select 1 s_id, 'Joe' s_name, 'ACTIVE' status , 6 grade, 101 fac_code from dual
)
, marks as
(
select 1 s_id, 100 score from dual
)
/* main query */
select s.s_name, m.score, s.status
from student s
join marks m on s.s_id = m.s_id
WHERE S.GRADE>5
and (s.fac_code in (select FAC_CODE from faculty_list)
or (select fac_code from faculty_list ) is null)
;