Используя Oracle 11.2 я пытаюсь выбрать 2 сгруппированных списка из таблиц ниже, вот мой код:
CREATE TABLE tmp_main AS (
SELECT rownum col1, 'txt_' || to_char(rownum) Col2 FROM dual
CONNECT BY rownum<=2
);
CREATE TABLE tmp_keys AS (
SELECT DECODE(rownum,1,1,2,1,3,1,4,2,5,2,6,2) col1, 'key_' || to_char(rownum) key1 , rownum seq FROM dual
CONNECT BY rownum<=6
);
CREATE TABLE tmp_line AS (
SELECT DECODE(rownum,1,1,2,1,3,1,4,1,5,2,6,2,7,2,8,2) col1, 'line_' || DECODE(rownum,2,1,3,1,4,2,5,3,7,3,8,4) line1 , rownum seq FROM dual
CONNECT BY rownum<=8
);
update tmp_line set line1=null where line1='line_';
update tmp_keys set seq=null where col1=1;
tmp_keys.seq может быть нулевым, поэтому мне нужно сначала упорядочить по seq, а затем key1 Вот что я пробовал:
SELECT m.col1,m.col2,
RTRIM(XMLAGG(XMLELEMENT(E,k.key1 , ',').EXTRACT('//text()') ORDER BY k.seq,k.key1 ).GetClobVal(),',') as key_list ,
RTRIM(XMLAGG(XMLELEMENT(E,l.line1 || ',').EXTRACT('//text()') ORDER BY l.seq ).GetClobVal(),',') line_list
FROM tmp_main m
JOIN tmp_keys k
ON m.col1=k.col1
JOIN tmp_line l
ON m.col1=l.col1
group by m.col1,col2;
Что дает:
col1 col2 key_list line_list
1 txt_1 key_1,key_1,key_1,key_1,key_2,key_2,key_2,key_2,key_3,key_3,key_3,key_3 ,,,line_1,line_1,line_1,line_1,line_1,line_1,line_2,line_2,line_2
2 txt_2 key_4,key_4,key_4,key_4,key_5,key_5,key_5,key_5,key_6,key_6,key_6,key_6 line_3,line_3,line_3,,,,line_3,line_3,line_3,line_4,line_4,line_4
ie дубликатов.
То, что я хотел бы, это:
col1 col2 key_list line_list
1 txt_1 key_1,key_2,key_3 ,line_1,line_1,line_2
2 txt_2 key_3,key_4,key_5 line_3,,line_3,line_4
ie сохраняются нулевые значения line1.
Предостережения:
- Реальный запрос намного больше, поэтому сканирование 1 таблицы было бы неплохо, так как важна скорость.
- 2 списка могут быть> 4000 символов, поэтому нельзя использовать listagg или аналогичные функции (поэтому я использовал xmlagg и GetClobVal ())
Любая помощь приветствуется