如何在 Oracle 查询中使用 listagg 条件

How to use a condition on listagg on Oracle query

我有 3 个 table:table_A、table_B 和 table_C。 Table_A 有一个主键并由来自 table_B 的外键引用。 Table_C 有一个由来自 table_B 的外键引用的主键。设计是这样的:

T̲a̲b̲l̲e̲_̲A̲
ID_A
TextData

T̲a̲b̲l̲e̲_̲B̲:
ID_B
ID_A
ID_C

T̲a̲b̲l̲e̲ ̲C̲:
ID_C
TextData

查询:

select a.id_a,
       a.textdata,
       listagg(c.textdata, ', ') within group (order by c.id_c) data_c
from   table_a a
       inner join table_b b on (a.id_a = b.id_a)
       inner join table_c c on (b.id_c = c.id_c)
where c.textdata like :data
group by a.id_a, a.textdata;

我只是从 c.textdata 中的一个 table 获取数据,而不是从 listagg。如果我尝试使用此查询:

select a.id_a,
       a.textdata,
       listagg(c.textdata, ', ') within group (order by c.id_c) data_c
from   table_a a
       inner join table_b b on (a.id_a = b.id_a)
       inner join table_c c on (b.id_c = c.id_c)
where listagg(c.textdata, ', ') like :data
group by a.id_a, a.textdata;

我收到如下错误:此处不允许使用组函数

如何在 listagg 参数上给出条件,因为我需要来自 listagg 的数据?

您可以尝试包装您的查询:

select *
from (
      select a.id_a,
             a.textdata,
             listagg(c.textdata, ', ') within group (order by c.id_c) data_c
      from   table_a a
             inner join table_b b on (a.id_a = b.id_a)
             inner join table_c c on (b.id_c = c.id_c)
      group by a.id_a, a.textdata
     )
where data_c like :data

或使用 HAVING 对 LISTAGG 构建的字段应用条件:

select a.id_a,
       a.textdata,
       listagg(c.textdata, ', ') within group (order by c.id_c) data_c
from   table_a a
       inner join table_b b on (a.id_a = b.id_a)
       inner join table_c c on (b.id_c = c.id_c)
group by a.id_a, a.textdata
having listagg(c.textdata, ', ') within group (order by c.id_c) like :data