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 个唯一值使用子查询。
我在 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 个唯一值使用子查询。