【问题标题】:How to use a condition on listagg on Oracle query如何在 Oracle 查询中使用 listagg 中的条件
【发布时间】:2016-04-01 07:42:59
【问题描述】:

我有 3 个表: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 表中获取数据,而不是从 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中的数据?

【问题讨论】:

    标签: oracle join listagg


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我尝试运行查询,得到如下结果:"data_c":invalid identifier
    • 对不起,我的情况有误。感谢您的支持:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2016-07-25
    相关资源
    最近更新 更多