Oracle Select JOIN Listagg。输出中的重复项。使用Distinct或其他

时间:2016-07-05 20:28:17

标签: sql oracle select

我一直在处理两个表(一对多)之间的查询,并使用LISTAGG将所有字段一起附加到一个字符串中。我注意到输出有重复值,我发现表中有重复记录。如何使用不同或其他技术删除副本。

这是我的查询

SELECT Table2.PersonId, 
LISTAGG(case Table2.BookTitleDesc 
        when 'Value1' then '1'
            when Value2' then '2'
            when 'Value3' then '3'
            when 'Value4' then '4'

 end, ':') 
WITHIN GROUP (ORDER BY Table2.BookTitleDesc )  
FROM Table1
INNER JOIN Table2 
ON Table1.PersonId = Table2.PersonId
GROUP BY Table2.PERSON_ID

我得到的输出就像1:1:2:3:4。理想情况下,BookTitleDesc应该是唯一的,但表格有重复。在我的CASE .. WHEN声明中,它会很长。一世 有很多要过滤,我看到有很多重复。如何使用DISTINCT或其他技术来避免输出中的重复?

由于

3 个答案:

答案 0 :(得分:0)

你不能在聚合之前通过SELECT DISTINCT运行吗?

SELECT s.PersonId, 
LISTAGG(case s.BookTitleDesc 
        when 'Value1' then '1'
            when 'Value2' then '2'
            when 'Value3' then '3'
            when 'Value4' then '4'

 end, ':') 
WITHIN GROUP (ORDER BY s.BookTitleDesc )  
FROM (
    SELECT DISTINCT Table2.PersonId,
        Table2.BookTitleDesc
    FROM Table1
    INNER JOIN Table2 
    ON Table1.PersonId = Table2.PersonId
    ) s
GROUP BY s.PERSON_ID

答案 1 :(得分:0)

LISTAGG聚合函数没有删除重复项的选项,因此您必须先删除它们。

在下面的代码中,Table2_ND将是Table2,没有重复,与使用“WITH”语法糖的Bacon Bits基本相同。

WITH Table2_ND AS (SELECT DISTINCT * FROM Table2)
SELECT   Table2_ND.PersonId
        ,LISTAGG(
            CASE Table2_ND.BookTitleDesc 
              WHEN 'Value1' THEN '1' 
              WHEN 'Value2' THEN '2' 
              WHEN 'Value3' THEN '3' 
              WHEN 'Value4' THEN '4' 
            END, ':') WITHIN GROUP (ORDER BY Table2_ND.BookTitleDesc)
FROM     Table1 INNER JOIN Table2_ND ON Table1.PersonId = Table2_ND.PersonId
GROUP BY Table2_ND.PersonId, Table2.BookTitleDesc;

答案 2 :(得分:0)

在最新的 Oracle sql(我认为从 19c 版开始)有 listagg 不同:

select listagg(distinct ID, ', ') from TAB_1 t1 inner join TAB_2 t2 on t1.ID = t2.TAB1_ID;

这只会给你不同的 ID