2017-10-12 73 views
0

我有這個查詢從產品獲取庫存數據,並且需要在一列中完成,因此我使用此列表聚合查詢(其他信息:Select subquery that return multiple rows as string (one column) in table (Oracle SQL) )。但在某些數據中出現一些錯誤:字符串連接的結果太長。如何優化這個查詢並解決這個錯誤? (我需要,只有在這個子查詢,因爲查詢在其他功能使用的變化)謝謝子查詢Listagg獲取錯誤:字符串連接的結果太長

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 
+0

一種選擇是升級到Oracle 12cR2它確實提供了處理溢出支持[瞭解更多](https://oracle-base.com/文章/ 12C/LISTAGG-功能的增強,12cr2#處理,溢出錯誤)。不是完全滑稽:Oracle 11g不是一個積極支持的版本。 – APC

+0

使用oracle 11g的項目無法升級 –

+0

我懷疑是這種情況,這就是爲什麼我把它作爲註釋發佈而不是答案。 – APC

回答

0

XMLAGG方法可用於聚合字符串。

例子。

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; 

在你的情況下,第一個子查詢將是這樣的。

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

謝謝你的解決方案,它解決了這個問題。 –

相關問題