【发布时间】:2020-01-09 09:54:36
【问题描述】:
使用 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
即重复。
我想要的是:
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
即保留空 line1 值。
注意事项:
- 真正的查询要大得多,因此 1 次表扫描会很好,因为速度很重要。
- 这 2 个列表可能 > 4000 个字符,因此不允许使用 listagg 或类似函数(这就是我使用 xmlagg 和 GetClobVal() 的原因)
任何帮助表示赞赏
【问题讨论】: