생계/Oracle2022. 9. 10. 23:33

계층구조의 수직적 통합으로 순환관계 모델이 만들어 질수 있다

오라클에서는 start with 구문을 제공하여 간단하게 순환전개 쿼리를 작성할 수 있다.

 

1) 순환전개 SQL 

SELECT LEVEL, 부서코드, 부서명, 상위부서코드, PRIOR 부서코드
   FROM 부서
 START WITH 부서코드 ='001'
CONNECT BY 상위부서코드 = PRIOR 부서코드   
 

부서코드 '001' 을 가진 RECORD 로 부터 시작해서 해당부서코드가 상위부서코드로 되어있는 하위 레코드들을 찾아가는 쿼리이다. 

LEVEL, PRIOR 는 RECURSIVE SQL 에 제공되는 가상으로 만들어진 컬럼이다. 

LEVEL 은 해당 레코드의 depth 를, prior 는 "앞서 읽은"  이라는 의미로 이것을 단서로 계층적으로 레코드들을 찾아나간다.

 

2) 순환전개 결과의 정렬 

 SELECT LEVEL, 부서코드, 부서명, 상위부서코드
  FROM 부서
 START WITH 부서코드 ='001'
CONNECT BY 상위부서코드 = PRIOR 부서코드   
ORDER SIBLINGS BY 부서코드

 정렬된 결과를 얻기 위해서는 ORDER BY 중간에 SIBLINGS 를 써줘야 한다. 

같은 레벨에서의 정렬을 의미한다. 

 

3) 실행순서 

(1)START WITH 에서 시작해서 

(2) CONNECT BY 로 순환전개를 풀고 나서야

(3) WHERE 조건에 맞는 ROW 만 취하고 나머지는 discard 한다.

 

* 인덱스 생성 : 위 쿼리에서는 prior 에서 찾는 값이 상수가되어 '상위부서코드'를 찾게 되므로 

상위부서코드에 인덱스가 필요하다. but 역전개 쿼리 가능성도 존재하므로  '부서코드' 에도 인덱스를 

만드는게 좋다. 

 

반응형

'생계 > Oracle' 카테고리의 다른 글

오라클 DISKGROUP RENAME  (0) 2022.12.21
ASM 사용중 datafile 을 다른 diskgroup 으로 이동  (0) 2022.12.21
트리거 안쓰는 이유  (0) 2022.08.30
dbms random  (0) 2022.08.24
[oracle] db접속 안될때  (0) 2022.08.15
Posted by 돌고래트레이너