El * el operador es 'codicioso' por defecto
. Estás permitiendo cualquier carácter entre distinct y ) , en cualquier cantidad. e incluyendo el primer ) mismo.
Como sugirió EatÅPeach, puede hacer que no sea codicioso con ? :
Así que aquí, con .*? en lugar de .* :
select regexp_substr(
'select count(distinct empno), count(distinct deptno) from emp',
'count\(distinct.*?\)')
from dual;
O puede especificar que debe ser cualquier carácter excepto ) con [^)]* en lugar de .* .
select regexp_substr(
'select count(distinct empno), count(distinct deptno) from emp',
'count\(distinct[^)]*\)')
from dual;