繁体   English   中英

Listagg函数在子查询中不起作用

[英]Listagg function is not working in sub query

Listagg函数在子查询中使用时不起作用,尽管在prod列中使用listagg函数未将所有产品串联在一起

select
    a.id,
    a.num,
    (listagg(c.prod_name,',') within group(order by prod_name)
from product c
where c.prod_id = NVL(b.prod_id,b.prod_pos) As prod
from master a, base_product b
where
    b.id = a.id and
    b.type = 1 and
    a.id = 12345;

您的select子句中的子查询缺少select关键字,这可能是错误的直接来源。 但是,我们可以改进您的查询,而是加入进行汇总的子查询:

select
    a.id,
    a.num,
    coalesce(c.prod, 'NA') as prod
from master a
inner join base_product b
    on b.id = a.id
left join
(
    select listagg(prod_name, ',') within group(order by prod_name) as prod
    from product
) c
    on c.prod_id = NVL(b.prod_id, b.prod_pos) 
where
    b.type = 1 and
    a.id = 12345;

除了重构对listagg的调用,我还用显式inner join listagg替换了您的隐式listagg语法。 这是编写查询的首选方式,也是这种样式,因为25年前已成为ANSI SQL标准的一部分。

您可以将listagg(prod, ',') within group(ORDER BY prod)与cte或派生表中num列上的group by ,并将其连接到主表以获取id ,如下所示。

SELECT t2.id,
       t2.num,
       t1.prod
FROM
  (SELECT num,
          listagg(prod, ',') within group(
                                          ORDER BY prod) AS prod
   FROM table1
   GROUP BY num ) t1
JOIN table1 t2 ON t1.num = t2.num
order by t2.id\\

要么

WITH t1 AS
  (SELECT num,
          listagg(prod, ',') within group(
                                          ORDER BY prod) AS prod
   FROM table1
   GROUP BY num)
SELECT t2.id,
       t2.num,
       t1.prod
FROM t1
JOIN table1 t2 ON t1.num = t2.num
ORDER BY t2.id\\

给您示例数据:

ID  NUM         PROD
--------------------
101 1701A001    book
102 1701A001    data
103 1702B005    bat
104 1702B005    ball
105 1703C006    Stumps

结果:

ID  NUM         PROD
-------------------------
101 1701A001    book,data
102 1701A001    book,data
103 1702B005    ball,bat
104 1702B005    ball,bat
105 1703C006    Stumps

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM