UNION ALL을 XMLAGG로 바꿀려고 합니다. 1 4 1,751

by 동안이 [2015.11.30 16:09:34]


캡쳐.JPG (81,364Bytes)

고민을 해봐도 잘 안풀려서 질문을 남깁니다.

여러 테이블에서 가져오는 부분이 많아서.

TB_PHOTO 라는 메인테이블 쿼리를 짰는데.

SELECT  A.P_ID

        ,  (SELECT SUBSTR(XMLAGG (XMLELEMENT (C, ',', C.CA_NAME) ORDER BY CA_NAME).EXTRACT ('//text()'), 2) AS  CA_NAME
                              FROM TB_CATEGORY C, TB_PHOTOCATEGORY CP
                             WHERE C.CA_ID = CP.CA_ID
                               AND CP.P_ID = A.P_ID) AS CA_NAME
             , (SELECT SUBSTR(XMLAGG (XMLELEMENT (B, ',', B.MAJOR_NAME) ORDER BY MAJOR_NAME).EXTRACT ('//text()'), 2) AS MAJOR_NAME
                  FROM TB_PHOTOPERSON B
                 WHERE B.P_ID = A.P_ID) AS MAJOR_NAME    

,    <-----------------------------------------------------

 FROM TB_PHOTO A
   WHERE 1 = 1

AND A.P_STATUS IN ('2')

 

이게 전체쿼리 인데.  위에 XMLAGG로 짠 쿼리들은 CONNECT BY로 별도로 짠 쿼리들을

XMLAGG로 짜서 넣었는데

아래 UNION ALL 로 짠 쿼리도 위에 화살표 부분에 XMLAGG로 해서 넣을려고 합니다.

해당 조건에 따라서 엑셀 화면에 보여주기 위해서 UNION ALL 을 사용했는데.

어떻게 XMLAGG로 짜야할지 부탁 좀 드리겠습니다.

SELECT A.META_ID, METACODE_NM
  FROM TB_STMETA A, TB_STMETAPHOTO B, TB_STMETACODE C
 WHERE A.META_ID = B.META_ID
    AND A.META_ID = C.META_ID
    AND META_VALUE = C.METACODE_ID
    AND P_ID = 364831
    AND CODE_FLAG = 1
UNION ALL
SELECT A.META_ID, META_VALUE AS METACODE_NM
  FROM TB_STMETA A, TB_STMETAPHOTO B
 WHERE A.META_ID = B.META_ID AND P_ID = 364831 AND CODE_FLAG = 2
ORDER BY META_ID) META_ID

 

 


 

by 마농 [2015.11.30 16:47:37]

UNION ALL 쿼리를 인라인뷰로 감싸면 되는데요.
이때 각각의 UNION 쿼리에 p_id = a.p_id 조건을 주면 에러가 발생될 것입니다.
메인의 컬럼이 인라인뷰를 두 단계 침투할 수 없기 때문이죠.
조건을 주려면 인라인뷰 밖에서 조건을 주면 됩니다.


하지만 이 때 주의해야 할 것은
성능저하가 발생되지는 않는지? 실행계획을 확인해야 합니다.
내부적으로 쿼리변형이 발생하여 조건절이 안으로 적절하게 침투되었는지 확인해야 합니다.
만약 조건절이 인라인뷰 안으로 침투하지 못한다면 성능저하가 우려됩니다.


by 동안이 [2015.11.30 16:57:04]

한쿼리로 다 해야 하는데. 그러면 어떻게 해야 할까요.. ㅠㅠ  엑셀에 그대로 보여주기 위해서.

한쿼리로 바꾸고 있었거든요.. 여기서는 xmlagg로 하면 된다고 하더라구요.


by 마농 [2015.11.30 17:09:34]
(
SELECT SUBSTR(
       XMLAGG(XMLELEMENT(C, ',', metacode_nm) ORDER BY meta_id).EXTRACT('//text()')
       , 2) AS metacode_nm
  FROM (SELECT b.p_id, a.meta_id, metacode_nm
          FROM tb_stmeta a, tb_stmetaphoto b, tb_stmetacode c
         WHERE a.meta_id = b.meta_id
           AND a.meta_id = c.meta_id
           AND b.meta_value = c.metacode_id
           AND a.code_flag = 1
        -- AND p_id = 364831    -- 조건은 인라인뷰 밖으로
         UNION ALL
        SELECT b.p_id, a.meta_id, meta_value as metacode_nm
          FROM tb_stmeta a, tb_stmetaphoto b
         WHERE a.meta_id = b.meta_id
           AND a.code_flag = 2
        -- AND p_id = 364831    -- 조건은 인라인뷰 밖으로
        )
 WHERE p_id = a.p_id            -- 조건은 인라인뷰 밖으로
) AS metacode_nm

 


by 동안이 [2015.12.01 09:59:31]

마뇽님 감사합니다!! 해결 되었습니다. ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입