Oracle sql:使用两个listagg

时间:2015-06-25 15:26:28

标签: sql oracle

我正在使用以下代码来显示“DEL”文本和“PAL”文本。 'DEL'和'PAL'文本可以跨越多行(并且每行的行数不一定相同)。

select trim(listagg(tx1.text, ', ') within group (order by tx1.text)) del_text,
trim(listagg(tx2.text, ', ') within group (order by tx2.text)) pal_text
from oes_ordtxt tx1
inner join oes_ordtxt tx2
    on tx1.key1 = tx2.key1
    and tx1.key2 = tx2.key2
    and tx1.key3 = tx2.key3
    and tx2.doctyp = 'PAL'
where tx1.key1 = '0018104834'
and tx1.key2 = '00001'
and tx1.key3 = '001'
and tx1.doctyp = 'DEL'

我遇到的问题是,我在'DEL文本上有多行,而在'PAL'文本上只有一行,'PAL'文本重复,例如。

enter image description here

'PAL_TEXT'是重复的,因为只存在一个PAL_TEXT,但存在三个DEL_TEXT。

有没有办法删除重复项?

谢谢,SMORF

2 个答案:

答案 0 :(得分:1)

聚合中有多少个表并不重要(遗憾的是,如果没有您的数据结构,我无法检查语法):

select (select listagg(column_value,', ') within group (order by column_value) from table (del_text)) del_text
      ,(select listagg(column_value,', ') within group (order by column_value) from table (pal_text)) pal_text
from (select collect (distinct tx1.text) del_text,
             collect (distinct tx2.text) pal_text
      from oes_ordtxt tx1
      inner join oes_ordtxt tx2
         on tx1.key1 = tx2.key1
        and tx1.key2 = tx2.key2
        and tx1.key3 = tx2.key3
        and tx2.doctyp = 'PAL'
      where tx1.key1 = '0018104834'
        and tx1.key2 = '00001'
        and tx1.key3 = '001'
        and tx1.doctyp = 'DEL'
      group by 1)

答案 1 :(得分:0)

将选择重写为

1)对连接键上的两个表进行分组并计算listagg(可能删除重复键)

2)加入结果

连接将始终为1:1,因此不会导致重复。