2012-07-24 136 views
2

可能重複:
LISTAGG in oracle to return distinct values消除重複使用Oracle LISTAGG功能

我使用的是Oracle LISTAGG功能,但我回到名單之內我其實想消除重複,只有迴歸不同的值。

查詢我已經是這樣的:

select a.id, 
     a.change_id, 
     LISTAGG(b.name, ',') WITHIN GROUP (ORDER BY b.name) AS "Product Name", 
from table_a a, 
     table_b b 
where a.id = 1 
and b.change_id = c.change_id 
group by a.id, a.change_id 

目前,它返回(只顯示一個記錄):

1 1 NameA, NameA, NameB, NameC, NameD, Name D 

我想回的是:

1 1 NameA, NameB, NameC, Name D 

希望有人能協助。

謝謝。

+0

[LISTAGG在甲骨文可能重複返回不同的值](http://stackoverflow.com/questions/11510870/listagg-in-oracle-to-return-distinct-values),也在這裏http://dba.stackexchange.com/questions/696/eliminate -duplicates-in-listagg-oracle – 2012-07-24 05:20:31

回答

1

由於評論中的鏈接答案沒有提供我的解決方案,所以我會發布它。

我只用table_b虛擬數據顯示的概念,你可以輕鬆地添加您的加入等:

with table_b as (-- dummy data 
select 'name'||mod(level,3) name 
     ,mod(level,3) id 
    from dual 
    connect by level < 10 
union all 
select 'name'||mod(level,2) name 
     ,mod(level,3) id 
    from dual 
    connect by level < 10 
) 
select id 
     ,RTRIM (
       XMLAGG (
         XMLELEMENT (E,XMLATTRIBUTES (name|| ',' AS "Seg") 
        ) 
        ORDER BY name ASC 
      ).EXTRACT ('./E[not(@Seg = preceding-sibling::E/@Seg)]/@Seg'), 
       ',' 
      ) AS "Product Name" 
     ,LISTAGG(b.name, ',') WITHIN GROUP (ORDER BY b.name) AS "Product Name with dups" 
    from table_b b 
group by id; 

(從https://forums.oracle.com/forums/thread.jspa?messageID=9634767&tstart=0#9943367採取IDEA)

+0

與一個簡單的'LISTAGG'解決方案相比,它必須非常緩慢......但是,我喜歡它! – 2012-07-24 07:08:40

+0

@LukasEder:是的,可能會比較慢,但是'LISTAGG'沒有'DISTINCT',所有其他的解決方案都會執行兩個全表掃描或者使用也比'LISTAGG'慢的regexp。 (並感謝您的喜好) – GWu 2012-07-24 07:14:23

+1

我不確定是否僅僅因爲應用了'DISTINCT'而引入了全表掃描?使用'LISTAGG'(或任何其他聚合方法列出組中的所有元素),無論如何將會有一個不可避免的全表掃描,在「列出」字段中沒有索引...我可以想象['DISTINCT' in [subsection](http://stackoverflow.com/a/11511203/521799)效果最好,但這只是一個猜測 – 2012-07-24 07:23:34