首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Subquery获取错误:字符串连接的结果太长

问Subquery获取错误:字符串连接的结果太长
EN

Stack Overflow用户
提问于 2017-10-12 05:11:42
回答 1查看 182关注 0票数 0

我有一个从产品中获取库存数据的查询,它需要在一个列中完成,所以我使用这个列表聚合查询(附加信息:Select subquery that return multiple rows as string (one column) in table (Oracle SQL))。但是在一些数据中得到了一些错误:字符串连接的结果太长了。如何优化此查询并解决此错误?(我只需要在这个子查询中更改,因为查询在其他函数中使用)谢谢

代码语言:javascript
复制
SELECT K.PRODUCT_NO, ..., (SELECT i.OPTIONS
    FROM PRODUCT p , ...
    LEFT JOIN (
        SELECT ITM.PRODUCT_NO
            ,LISTAGG(NVL2(ITM.OPTION1, ITM.OPTION1 || (chr(13)||chr(10)), '') || NVL2(ITM.OPTION2, ITM.OPTION2 || (chr(13)||chr(10)), '') || NVL2(ITM.OPTION3, ITM.OPTION3 || (chr(13)||chr(10)), '') || NVL2(ITM.OPTION4, ITM.OPTION4 || (chr(13)||chr(10)), ''), ',') WITHIN
        GROUP (
                ORDER BY ITM.itm_no
                ) AS OPTIONS
        FROM ITEM ITM
        GROUP BY ITM.PRODUCT_NO
        ) i ON (p.PRODUCT_NO = i.PRODUCT_NO)
    WHERE P.PRODUCT_NO = K.PRODUCT_NO) as OPTIONS,
    (SELECT i.OPTIONS
    FROM PRODUCT p
    LEFT JOIN (
        SELECT ITM.PRODUCT_NO
            ,LISTAGG(NVL2(QUANTITY, QUANTITY || (chr(13)||chr(10)), '0'))  WITHIN
        GROUP (
                ORDER BY ITM.itm_no
                ) AS OPTIONS
        FROM ITEM_INVENTORY ITM
        GROUP BY ITM.PRODUCT_NO
        ) i ON (p.PRODUCT_NO = i.PRODUCT_NO)
    WHERE P.PRODUCT_NO = K.PRODUCT_NO) as QTY
    from PRODUCT K
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 06:11:24

Xmlagg方法可用于聚合字符串。

举例说明。

代码语言:javascript
复制
select rtrim(
           xmlserialize(content extract(xmlagg(xmlelement(e, object_name || ',') order by object_id), '//text()')
                        no indent)
         , ',')
       , object_type
    from user_objects
group by object_type;

在您的示例中,第一个子查询将如下所示。

代码语言:javascript
复制
  select ITM.PRODUCT_NO
       , rtrim(
           xmlserialize(
             content extract(
                       xmlagg(
                         xmlelement(
                           e
                         ,    nvl2(ITM.OPTION1, ITM.OPTION1 || (chr(13) || chr(10)), '')
                           || nvl2(ITM.OPTION2, ITM.OPTION2 || (chr(13) || chr(10)), '')
                           || nvl2(ITM.OPTION3, ITM.OPTION3 || (chr(13) || chr(10)), '')
                           || nvl2(ITM.OPTION4, ITM.OPTION4 || (chr(13) || chr(10)), '')
                           || ',')
                         order by ITM.itm_no)
                     , '//text()')
             no indent)
         , ',')
    from ITEM ITM
group by ITM.PRODUCT_NO

在这里您可以找到更多的方法https://www.programmingmusings.com/index.php/2015/05/22/string-aggregation-in-oracle-sql/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46701855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档