[ORACLE]START WITH ... CONNECT BY를 이용한 계층형 쿼리

AikiToWeb·2022년 10월 6일
0

SQL

목록 보기
12/20

작업했던 화면 : 관리자 > 관리자 그룹 권한 > 관리자 현황 > 관리자 등록(1/2)

관리자 정보를 조회, 등록하는 화면을 만들 때, 부서별로 조회 할 필요가 있었다.

selfJoin을 했을 때 원하는대로 조회도 잘 안 되고 막막했다.
selfJoin으로 무식하게 했었는데…이런 방법이 있었던 것이다.

근데 계층형 쿼리(Hierarchical Query)는 오라클에서만 지원한다고 한다.

부서별 검색 쿼리

WITH ORG AS
(
	SELECT
		  LEVEL LV
		, CONNECT_BY_ROOT ORG_CD AS ROOT_ID
		, ORG_CD
		, SUPER_ORG_CD
		, ORG_NM
		, SQ
		, CONNECT_BY_ISLEAF AS ISLEAF
	FROM TBBDDT01 A
	WHERE 1=1
	START WITH SUPER_ORG_CD = @ORG_CD // 루트 노드 지정
	CONNECT BY PRIOR ORG_CD = SUPER_ORG_CD. // 자식-부모 관계 연결
	ORDER SIBLINGS BY SQ
)
SELECT
	  B.EMP_NO
	, B.EMP_NM
	, B.IN_OFFI_YN
	, B.POS_GRD_CD
	, B.POS_GRD_NM
	, B.POS_CD
	, B.POS_NM
	, A.SUPER_ORG_CD
	, B.ORG_CD
	, A.ORG_NM
	, B.HIRE_YMD
	, B.RETIRE_YMD
	, B.LAST_LDN_DTTM
	, B.DATA_LDN_YMD
	, B.CDC_DATE
	, B.CDC_PRC_GB
	, CASE WHEN C.USER_ID IS NOT NULL THEN ‘Y’ ELSE ‘N’ END AS IS_REGIED
FROM ORG A
	INNER JOIN TBBDDT02 B ON A.ORG_CD = B.ORG_CD
	LEFT OUTER JOIN TBBDAA03 C ON C.USER_ID = B.EMP_NO
WHERE B.EMP_NO NOT IN ( SELECT NVL(USER_EMP, ‘0’) FROM TBBDAA03 )

출처 : [오라클] 계층형 쿼리 ( START WITH ... CONNECT BY )|작성자 자바킹


  • 노드(node) : 위 그림에서 원모양으로 표시된 항목을 노드라고 한다. 각각의 품목이 하나의 노드가 되며 실제 테이블에서는 하나의 로우에 대응

  • 부모(parent) : 부모노드라고도 한다. 즉 트리구조에서 상위에 있는 노드를 말한다.

  • 자식(child) : 자식노드라고도 한다. 위 그림에서 '모니터'는 컴퓨터의 자식노드이며, 컴퓨터는 모니터와 본체의 부모노드가 된다.

  • 리프(leaf) : 리프노드라고도 한다. 더이상 하위에 연결된 노드가 없는 항목을 말한다. 즉 자식노드가 없는 노드라고 할수있으며 모니터, 프린터, 랜카드가 이에 해당된다.

  • 루트(root) : 계층형, 트리구조에서 최상위에 있는 노드를 말한다. 컴퓨터가 이에 해당

  • 레벨(level) : 트리구조에서의 각각의 계층을 말한다. 루트에 해당되는 '컴퓨터'가 1레벨이 되며, 순차적으로 그 하위에 있는 '모니터', '본체' 등이 2레벨이 된다.

  • START WITH 조건1 : 루트노드를 식별한다. 조건1을 만족하는 모든 ROW 들은 루트노드가 된다.
    START WITH절을 생략할수도 있는데 이러한 경우 모든 ROW들을 루트노드로 간주한다. 조건1에는 서브쿼리도 올수있다.

  • CONNECT BY 조건2 : 부모와 자식노드들 간의 관계를 명시하는 부분이다.
    조건2에는 반드시 PRIOR연산자를 포함시켜야하며, 이는 부모노드의 컬럼을 식별하는데 사용된다.
    START WITH과는 달리 조건2에서는 서브쿼리가 올수 없다.
  • PRIOR연산자
    PRIOR키워드는 워직 계층형 쿼리에서만 사용하는 오라클 SQL연산자이다. 키워드라고 표현했지만 실제로는 CONNECT BY절에서 등호(=)와 동등한 레벨로 사용되는 연산자이며 CONNCET BY절에서 해당 컬럼의 부모로우를 식별하는데 사용된다.
  • 레벨 의사컬럼(LEVEL Pseudocolumn)

    계층형 정보를 표현할 때 레벨을 나타낸다.
    LEVEL도 일반적인 컬럼 처럼 SELECT, WHERE, ORDER BY 절에서 사용할수있다.

profile
개발과 합기

0개의 댓글