oracle 中的 listagg sql

listagg in oracle sql

我在 Oracle 中有这个 sql 查询:

SELECT listagg(A.name, ",") within group (ORDER BY A.id) as A,
listagg(B.name, ",") within group (ORDER BY B.id) as B
FROM some_table
join A on A.id = some_table.id
join B.name = some_table.name
where some_table.status in (1,2,3)
group by some_table.id

我的问题是我从 listagg 得到了我不想要的重复结果。 我该如何解决? 谢谢!

对于 Oracle 19 之前的 listagg(),Oracle 不支持 distinct

不过,在您的情况下,问题可能是由 join 的笛卡尔积引起的。这表明相关子查询是一种更好的方法:

select t.*,
       (select listagg(a.name, ',') within group (order by a.id)
        from A a
        where a.id = t.id 
       ) as a,
       (select listagg(b.name, ',') within group (order by b.id)
        from B b
        where b.id = t.id 
       ) as b
from some_table t
where t.status in (1, 2, 3)
group by t.id;

Listagg 函数不支持不同的选项。您应该对 select 个唯一值使用子查询。