2016-07-08 2 views
0

Проблема с PIVOT Oracle 11: Когда я выполняю следующее, я получаю нормализованные результаты с данными во всех полях F2-F4, где имеются данные; F1 является ключом, поэтому всегда есть данные:Lossy JOIN при использовании PIVOT в Oracle

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

Теперь я иду использовать функцию PIVOT Oracle присоединиться все поля F2 - F4, так что есть один F2 и т.д., поле для всех полей F2 среди как многие как 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

ОК, у меня была неправильная функция. Функция 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

Смежные вопросы