Você não precisa de um
DISTINCT
para obter o seu resultado; além disso, para obter o resultado em uma determinada ordem, basta um ORDER BY
cláusula: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