2016-07-08 4 views
0

Oracle 11の問題PIVOT:次のような場合、データが存在するすべてのフィールドF2〜F4にデータを正規化します。常にデータがあるので、F1キーです:OracleでPIVOTを使用する場合の損失JOIN

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

は今、私はすべてのフィールドF2に参加するために、OracleのPIVOT機能を使用するために行く - F4、F2、など、など、多くの間で、すべてのF2フィールドのフィールド1が存在するように次のように5行、すべての連結として、:

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) 
) 
) 

このすべてのデータは、F2行中に見出されないようにデータを返している、例えば、すべてのレコードに対して単一のF2列に連結戻ってきます。実際に動作するレコードでは、正規化された結果にあるすべてのデータを取得します。しかし、それが動作しない場合、正規化された結果にあるデータは返されません。

アイデア?私は何が欠けていますか?

ありがとうございます。

答えて

1

OK、私は間違った機能を使用していました。 Oracle LISTAGG関数は、私が行う必要があるものです。例:好評

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 

、例:

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 

あなたはこれを取得:

 
    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 

うーん、冗長性を多くの?これを実行してみましょう:

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 

あなたが入手してください:

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

これはどちらか評価しません - あなたのブラケットが一致していません。 – dipdapdop

+0

@dipdapdopはい、あなたは正しいです。そして、私は重要な部品を不必要にサブセレクトに埋め込んでしまったので、それらも削除しました。 –

+0

外部選択句に構文エラーがあります。また、WITHブロックにいくつかのテストデータを提供することをお勧めします。完全に動作する例を持つ方がよいでしょう。 – dipdapdop

関連する問題