Du behøver ikke en DISTINCT
for at få dit resultat; desuden, for at få resultatet i en given rækkefølge, er alt hvad du behøver en ORDER BY
klausul:
select trim(regexp_substr('bbb;aaa;qqq;ccc','[^;]+', 1,level) ) as q
from dual
connect by regexp_substr('bbb;aaa;qqq;ccc', '[^;]+', 1, level) is not null
order by level