2017-10-12 8 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

하나의 옵션을 찾을 수 있습니다 https://oracle-base.com/ ([자세한 내용을 보려면] articles/12c/listagg-function-enhancements-12cr2 # handling-overflow-errors). 완전히 익살 맞은 것은 아닙니다 : Oracle 11g는 적극 지원되는 버전이 아닙니다. – APC

+0

오라클 11g를 사용하는 프로젝트이며 업그레이드 할 수 없습니다. –

+0

그럴 것이라고 생각했기 때문에 답변이 아닌 의견으로 게시했습니다. – APC

답변

0

XMLAGG 방법은 집계 문자열로 사용할 수 있습니다 주셔서 감사합니다 (I는이 하위 쿼리로 인해 쿼리가 다른 기능에 사용되는 변화가 필요합니다).

예.

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 

당신이 더 많은 방법을 오버 플로우를 처리하기위한 지원을 제공하지 오라클 12cR2로 업그레이드하는 것입니다 https://www.programmingmusings.com/index.php/2015/05/22/string-aggregation-in-oracle-sql/

+0

솔루션을 제공해 주셔서 감사합니다. 문제가 해결되었습니다. –