2016-07-08 9 views
0

Problem mit Oracle 11 PIVOT: Wenn ich Folgendes ausführe, bekomme ich normalisierte Ergebnisse mit Daten in allen Feldern F2-F4, wo Daten vorhanden sind; F1 ist der Schlüssel so immer Daten hat:Lossy JOIN bei Verwendung von PIVOT in Oracle

select t1.F1, t2.F2, t2.F3, t2.F4 
from schema.t1, 
    schema.t2 
where 
t1.F1 = t2.F1 (+) 

Jetzt gehe ich Oracles eigene Achse gedreht verwenden, um alle Felder F2 zu verbinden - F4, so dass es eine F2 usw. Feld für alle F2 Felder unter so viele als 5 Reihen, die alle verketteten, wie folgt:

select * from (
select F1, 
TRIM("1_F2") || TRIM("2_F2") || TRIM("3_F2") || TRIM("4_F2") || TRIM("5_F2") as "F2", 
TRIM("1_F3") || TRIM("2_F3") || TRIM("3_F3") || TRIM("4_F3") || TRIM("5_F3") as "F3", 
TRIM("1_F4") || TRIM("2_F4") || TRIM("3_F4") || TRIM("4_F4") || TRIM("5_F4") as "F4" 
from (
select ROWNUM as RN, T.* from (
select t1.F1, t2.F2, t2.F3, t2.F4 
from schema.t1, 
     schema.t2 
where 
t1.F1 = t2.F1 (+) 
) T 
) 
PIVOT ( 
MAX(F2) as "F2", 
MAX(F3) as "F3", 
MAX(F4) as "F4" 
FOR RN in (1,2,3,4,5) 
) 
) 

beispiels Dies kehrt Daten, so dass nicht alle Daten zwischen den Reihen F2, gefunden, in eine einzige Reihe F2 zurück für alle Datensätze verketteten geht. Für die Datensätze, wo es funktioniert, bekomme ich tatsächlich alle Daten wie im normalisierten Ergebnis gefunden. Wenn es jedoch nicht funktioniert, werden keine Daten wie im normalisierten Ergebnis zurückgegeben.

Irgendwelche Ideen? Was vermisse ich?

Vielen Dank im Voraus.

Antwort

1

OK, ich hatte die falsche Funktion im Einsatz. Die Oracle LISTAGG-Funktion erledigt, was ich tun muss. Beispiel:

select F1, 
LISTAGG (F2, ' ') within group (order by F1) as "F2", 
LISTAGG (F3, ' ') within group (order by F1) as "F3", 
LISTAGG (F4, ' ') within group (order by F1) as "F4" 
from (
select t1.F1, t2.F2, t2.F3, t2.F4 
from schema.t1, 
     schema.t2 
where 
t1.F1 = t2.F1 (+) 
) group by F1 

Auf vielfachen Wunsch ein Beispiel:

create table myschema.t1 (
F1 varchar2(10) 
) 

create table myschema.t2 (
F1 varchar2(10), 
F2 varchar2(10), 
F3 varchar2(10), 
F4 varchar2(10) 
) 

insert into myschema.t1 (F1) values ('1'); 
insert into myschema.t1 (F1) values ('1'); 
insert into myschema.t1 (F1) values ('1'); 

insert into myschema.t2 (F1,F2,F3,F4) values ('1','Hello1','World1','1'); 
insert into myschema.t2 (F1,F2,F3,F4) values ('1','Hello2','World2','2'); 
insert into myschema.t2 (F1,F2,F3,F4) values ('1','Hello3','World3','3'); 

commit; 

select F1, 
LISTAGG (F2, ' ') within group (order by F1) as "F2", 
LISTAGG (F3, ' ') within group (order by F1) as "F3", 
LISTAGG (F4, ' ') within group (order by F1) as "F4" 
from (
select t1.F1, t2.F2, t2.F3, t2.F4 
from myschema.t1, 
     myschema.t2 
where 
t1.F1 = t2.F1 (+) 
) group by F1 

Sie diese:

 
    F1 F2                F3                F4 
    -- -------------------------------------------------------------- -------------------------------------------------------------- ----------------- 
    1 Hello1 Hello1 Hello1 Hello2 Hello2 Hello2 Hello3 Hello3 Hello3 World1 World1 World1 World2 World2 World2 World3 World3 World3 1 1 1 2 2 2 3 3 3 

Hmmm, Redundanzen viel? Versuchen Sie, diese ausgeführt wird:

select F1, 
LISTAGG (F2, ' ') within group (order by F1) as "F2", 
LISTAGG (F3, ' ') within group (order by F1) as "F3", 
LISTAGG (F4, ' ') within group (order by F1) as "F4" 
from (
select distinct t1.F1, t2.F2, t2.F3, t2.F4 
from myschema.t1, 
     myschema.t2 
where 
t1.F1 = t2.F1 (+) 
) group by F1 

Sie erhalten jetzt:

 
    F1 F2      F3      F4 
    -- -------------------- -------------------- ---------- 
    1 Hello1 Hello2 Hello3 World1 World2 World3 1 2 3 
+0

Dies gilt nicht beurteilen entweder - Ihre Klammern nicht übereinstimmen. – dipdapdop

+0

@dipdapdop Ja, Sie hatten Recht. Und ich hatte die wichtigen Teile unnötigerweise in Sub-Selects eingebettet, also habe ich auch diese weggelassen. –

+0

Es gibt immer noch einen Syntaxfehler in der äußeren SELECT-Klausel. Kann ich auch vorschlagen, dass Sie einige Testdaten in einem WITH-Block bereitstellen - es ist besser, ein voll funktionsfähiges Beispiel zu haben. – dipdapdop