Meus dados são como:
keycol,col1,col2,col3
1,a;b;c,some data,some other data
2,x,some data,some other data
3,y;z,some data,some other data
Onde uma coluna é delimitada no sistema de origem com ponto e vírgula.
E eu quero girá-lo para:
1,a,some data,some other data
1,b,some data,some other data
1,c,some data,some other data
2,x,some data,some other data
3,y,some data,some other data
3,z,some data,some other data
Encontrei uma técnica aqui , mas não consigo fazê-la funcionar:
CREATE TABLE yt
(keycol int, col1 varchar2(5), col2 varchar2(9), col3 varchar2(15))
;
INSERT ALL
INTO yt (keycol, col1, col2, col3)
VALUES (1, 'a;b;c', 'some data', 'some other data')
SELECT * FROM dual
;
INSERT ALL
INTO yt (keycol, col1, col2, col3)
VALUES (2, 'x', 'some data', 'some other data')
SELECT * FROM dual
;
INSERT ALL
INTO yt (keycol, col1, col2, col3)
VALUES (3, 'y;z', 'some data', 'some other data')
SELECT * FROM dual
;
Achei que poderia incluir o keycol no CONNECT BY dessa forma para obter cadeias recursivas paralelas, mas acho que não funciona assim. Tenho certeza de que fiz isso com CTEs recursivas no SQL Server.
SELECT keycol
,trim(regexp_substr(col1, '[^;]+', 1, level)) col1
,col2
,col3
FROM yt t
CONNECT BY keycol = PRIOR keycol AND instr(col1, ';', 1, level - 1) > 0
http://sqlfiddle.com/#!4/3d378
FWIW, estou no Oracle 10g.
Usando o código deste link como ponto de partida, isso deve fornecer o resultado sem a necessidade de
DISTINCT
:Consulte SQL Fiddle com demonstração