계층형쿼리 실행시 Ora-03113이 발생합니다 0 6 2,163

by 신고의추 [Oracle 에러코드] [2015.12.14 10:58:24]


SELECT * from test_emp a FULL OUTER JOIN test_depart b
ON a.depart_id = b.depart_id
START WITH parent_id IS NULL
CONNECT BY PRIOR b.depart_id = parent_id;

 

test_depart 테이블과 test_emp 테이블을 조인한 뒤

그 결과값으로 계층형 쿼리로 내보내고 싶었습니다.

그런데 위의 쿼리를 실행하면

'ORA-03113: end-of-file on communication channel' 에러가 발생합니다.

 

SELECT * from test_emp a FULL OUTER JOIN test_depart b
ON a.depart_id = b.depart_id

조인하는 이 부분만 사용시엔 데이터가 나옵니다.

총 52개의 데이터 중 48개는 조인된 사원정보,

나머지 4건은 사원이 없는 상위 부서라 사원정보란은 NULL값이 나옵니다.

parent_id가 NULL것은 최상위부서 1개 밖에 없습니다.

== 테이블 형태

test_emp : EMP_ID, EMP_NAME, DEPART_ID

(사원 테이블 : 사원번호, 사원이름, 부서번호)

test_depart : DEPART_ID, DEPART_NAME, PARENT_ID

(부서 테이블 : 부서번호, 부서이름, 상위부서 번호)

===========

최상위계층

2레벨

3레벨 사원정보

3레벨 사원정보

3레벨 사원정보

2레벨

3레벨 사원정보

3레벨 사원정보

3레벨 사원정보

4레벨 사원정보

4레벨 사원정보

2레벨

3레벨 사원정보

3레벨 사원정보

3레벨 사원정보

4레벨 사원정보

4레벨 사원정보

=============

대강 이런 순으로 나오게 할 생각입니다.

이 데이터를 계층형쿼리로 부서계층별로 사원들을 출력을 해보고싶은데

생각지 못한 에러가 발생합니다.

어떤 문제가 있는지 확인부탁드립니다.

 

 

by 겸댕2후니 [2015.12.14 11:02:39]

각테이블의 컬럼정보를 알려주세요.

parent_id 는 어느 테이블에 있는 컬럼인가요..?

그리고 connect by절이 잘못 쓰인 것 같습니다.

확인해보셔야 될 것 같아요

ex) connect by prior empno = mgr;  -- 상위->하위

     connect by prior mgr = empno;  -- 하위->상위


by 신고의추 [2015.12.14 11:16:06]

테이블 정보를 안써놨었네요. 수정하였습니다.

제가 검색하는 방식에서 문제가 있었던듯 합니다.

답변 감사합니다.


by 마농 [2015.12.14 11:08:06]

계층구조는 사원이 아닌 부서입니다.
부서만 계층쿼리 한뒤에 사원을 조인하세요.
조인은 왜? 풀조인인가요?
 

SELECT a.parent_id
     , a.depart_id
     , a.depart_name
     , b.emp_id
     , b.emp_name
  FROM (SELECT parent_id
             , depart_id
             , depart_name
             , ROWNUM rn
          FROM test_depart
         START WITH parent_id IS NULL
         CONNECT BY PRIOR depart_id = parent_id
        ) a
  LEFT OUTER JOIN test_emp b
    ON a.depart_id = b.depart_id
 ORDER BY a.rn, b.emp_id
;

 


by 신고의추 [2015.12.14 11:20:35]

이렇게 하는 방법이 있었네요!

전 풀조인으로 정보를 끌어낸 후 그 데이터로 계층형쿼리를 하려했었는데 비효율적인 방법이였네요.

그리고 제가 조인의 제대로된 사용법을 아직 모르는듯 합니다. 오늘도 새로운 정보를 알아가네요.

오늘도 답변 정말 감사드립니다.


by 마농 [2015.12.14 11:22:48]

비효율은 느리더라도 결과는 맞게 나오는거죠.

위 방법은 비효율이 아니라 아예 잘못된 사용법이죠.


by 신고의추 [2015.12.14 12:10:51]

그러네요. 잘못된 방법이였습니다.

점심시간인데 식사 맛있게 하세요~

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