계층형 쿼리사용중 정렬 관련 문의 입니다. 0 1 2,350

by 오완호 [SQL Query] [2013.08.02 11:50:25]


정렬1.png (6,759Bytes)
정렬2.png (9,019Bytes)


부서 Table 과 사용자 Table을 조인해서 트리구조로 출력하고 있습니다.

 SELECT
 A.DEPT_CODE
 , A.DEPT_NAME
 , A.P_DEPT_CODE
 , A.DEPT_SEQ
 , A.DEPT_LV
 , B.USER_NAME
 , B.USER_ID
 FROM (
 SELECT
 DEPT_CODE
 , LPAD(' ' , 4*(LEVEL-1)) || DEPT_NAME AS DEPT_NAME
 , P_DEPT_CODE
 , SEQ AS DEPT_SEQ
 , LEVEL AS DEPT_LV
 FROM DEPT
 START WITH PAR_ID = '000000101'
 CONNECT BY PRIOR DEPT_CODE = DECODE(DEPT_CODE, '000000101', NULL, P_DEPT_CODE)
 ORDER SIBLINGS BY DEPT_SEQ ASC
 ) A
 ,
 USER B
WHERE A.DEPT_CODE = B.DEPT_CODE
이렇게 조회 했을 때 와 LPAD(' ' , 4*(LEVEL-1)) || DEPT_NAME AS DEPT_NAME 이 부분을 DEPT_NAME 만 했을 때
조회 되는 데이터 순서가 틀리게 나와서 화면에 출력할때 약간 문제가 발생했습니다.

일단 TRIM(LPAD(' ' , 4*(LEVEL-1)) || DEPT_NAME) AS DEPT_NAME 이런 방식으로 사용해서 

최상위 정보부터 화면에 출력하면서 트리구조를 생성하고 있는데무슨이유로 조회되는 데이터 순서가 다르게 나오는 이유가 궁금합니다. 


by 마농 [2013.08.02 12:12:08]

a 와 b 를 조인하면서 정렬이 흐트러 지는 것입니다.
a 의 순서를 그대로 유지하려면 다음 둘중 한가지를 사용하시면 됩니다.


1. Hash 조인이 아닌 Nested Loop 조인을 타도록 힌트로 제어
SELECT /*+ ORDERED USE_NL(b) */ ...
- 주의 : b.dept_code 에 인덱스가 반드시 있어야 겠지요.


2. a 안에 Rownum AS rn 추가 한후 밖에서 Order by rn 추가
SELECT ...
  FROM (SELECT ROWNUM rn ...) a, b
 ORDER BY rn, user_id
;

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