쿼리 문의 0 1 1,102

by 색즉시공 [SQL Query] [2019.04.19 20:40:44]


XML 함수 사용하면 결과가 이상해서 올려봅니다. (버전 12C)

WITH
A_TBL AS (
SELECT 'A' CD FROM DUAL UNION ALL
SELECT 'E' CD FROM DUAL UNION ALL
SELECT 'C' CD FROM DUAL UNION ALL
SELECT 'B' CD FROM DUAL UNION ALL
SELECT 'D' CD FROM DUAL
),
B_TBL AS (
SELECT 'B' CD ,'BB' DT FROM DUAL UNION ALL
SELECT 'D' CD ,'DD' DT FROM DUAL UNION ALL
SELECT 'C' CD ,'BB' DT FROM DUAL
),
C_TMP AS (
    SELECT A.*
          ,( -- A.CD를 1 LEVEL 참조
            SELECT DT
              FROM B_TBL 
             WHERE CD = A.CD
               AND ROWNUM = 1
           ) AA
          ,( -- A.CD를 2 LEVEL 참조
            SELECT DT
              FROM (
                SELECT DT
                  FROM B_TBL 
                 WHERE CD = A.CD
                   AND ROWNUM = 1
                )
           ) BB
          ,(
           SELECT SUBSTR(XMLAGG(XMLELEMENT(A, LEVEL)
                  ORDER BY 1).EXTRACT('//text()') ,1)
             FROM DUAL
            CONNECT BY LEVEL <=3
           ) XAGG 
     FROM A_TBL A
)
SELECT *
  FROM C_TMP
ORDER BY 1

결과
CD  AA  BB  XAGG
A			123
B	BB	BB	123
C	BB	BB	123
D	DD	DD	123
E			123
----------------

SELECT *
  FROM C_TMP
 WHERE AA = 'BB'  -- 1 LEVEL 참조필드
ORDER BY 1

결과
CD  AA  BB  XAGG
B	BB	BB	123
C	BB	BB	123
----------------

SELECT *
  FROM C_TMP
 WHERE BB = 'BB'  -- 2 LEVEL 참조필드 조건 안먹힘
ORDER BY 1
결과
CD  AA  BB  XAGG
----------------

XML 함수  ,(
           SELECT SUBSTR(XMLAGG( ....
           ) XAGG 
를 빼고 하면 2 LEVEL 참조필드 조건 먹힘

SELECT *
  FROM C_TMP
 WHERE BB = 'BB'  -- 2 LEVEL 참조필드 조건 먹힘
ORDER BY 1

결과
CD  AA  BB
B	BB	BB
C	BB	BB

 

by 마농 [2019.04.22 09:09:55]

11G 에서는 2레벨 조건 자체가 안되요.
12C 에서는 되나 보네요?
안되던게 되는거니 아직 완벽하게 동작되는 건 아닌가 보네요.

테스트를 위해 1레벨로도 충분히 가능한걸 억지로 2레벨 쿼리를 만든 듯 한데요.
이런 억지 쿼리를 가지고 테스트 하기보다는
실제로 2레벨이 될수밖에 없는 그런 예제를 가지고 테스트해보세요.

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