Oracle pivot on a column with delimited data
Using the code from this link as a starting point, this should give you the result without the need for a DISTINCT:

select t.keycol,
    regexp_substr ( t.col1, '[^;]+', 1, n) as col1,
    t.col2,
    t.col3
from yt t 
cross join
(
    select level n
    from 
    (
        select max(length(col1) - length(replace(col1, ';'))) as max_semi
        from yt
    )
    connect by level &lt;= 1 + max_semi
) c
where c.n &lt;= 1 + length(col1) - length(replace(col1, ';'))
order by t.keycol, col1;


See SQL Fiddle with Demo