Coding Planet

[SQLD] 노랭이 87번 풀이 - START WITH...CONNECT BY PRIOR 본문

DB, SQL

[SQLD] 노랭이 87번 풀이 - START WITH...CONNECT BY PRIOR

jhj.sharon 2023. 9. 4. 14:43
반응형

| START WITH ... CONNECT BY

Oracle SQL에서 계층적 데이터를 쿼리하는데 사용되는 구문이다. 이 구문을 사용하면 트리 또는 그래프와 같은 계층적인 관계를 가진 데이터들을 쉽게 쿼리할 수 있다.

 

1. START WITH:

  • 계층 구조의 시작점을 지정한다.
  • 만약 부모가 없는 노드(루트 노드)를 시작점으로 선택하려면 'START WITH parent_colum IS NULL'을 사용한다.

2. CONNECT BY:

  • 부모와 자식 간의 관계를 지정한다.
  • PRIOR 키워드는 이전 레벨의 컬럼의 참조한다.
  • CONNECT BY PRIOR child_column = parent_column은 child_column의 값이 현재 행의 값이고, parent_colum의 값이 부모행인 값인 행을 찾는다.

3. PRIOR:

  • 현재 레벨의 컬럼 값을 이전 레벨의 값과 비교하는 데 사용된다.
  • PRIOR 자식 = 부모 : 계층구조에서 부모데이터에서 자식데이터 방향으로 전개하는 순방향 전개
  • PRIOR 부모 = 자식 : 반대로 자식 데이터에서 부모데이터방향으로 전개하는 역방향 전개

4. ORDER SIBLINGS BY:

  • 같은 계층 레벨의 행을 정렬하는 데 사용된다.

 

 

| 예제

예를 들어, 각 직원의 매니저와의 관계를 나타내는 테이블이 있다고 가정하자.

EMP_ID | EMP_NAME | MGR_ID
-------|----------|-------
1     | John     | NULL
2     | Mike     | 1
3     | Sara     | 1
4     | David    | 2

이 테이블에서 John은 매니저가 없고, Mike와 Sara는 John의 직원, David는 Mike의 직원이다.

 

이 관계를 쿼리하려면 다음과 같이 작성할 수 있다.

SELECT EMP_NAME
FROM EMPLOYEES
START WITH MGR_ID IS NULL -- 매니저가 없는 경우  == 최상위 직위 == ROOT NODE
CONNECT BY PRIOR EMP_ID = MGR_ID
ORDER SIBLINGS BY EMP_NAME;

--결과
EMP_NAME
--------
John
Mike
David
Sara

 

 

| Q66 - 계층형 쿼리 

C1 | C2 | C3
-------------
1  |    | A
2  | 1  | B
3  | 1  | C
4  | 2  | D

--실행할 쿼리
SELECT C3 
FROM TAB1
START WITH C2 IS NULL 
CONNECT BY PRIOR C1 =C2 
ORDER SIBLINGS BY C3 DESC

 

  • START WITH C2 IS NULL :  C2 값이 NULL인 행에서 시작한다. C1= 1, C3=A인 행이다.
  • CONNECT BY PRIOR C1 = C2 : 현재 행의 C1 값이 다음 행의 C2값과 일치하는 행을 찾는다. 
  • ORDER SIBLINGS BY C3 DESC : 같은 부모를 가진행(같은 계층)을 C3 값에 따라 내림차 순으로 정렬한다.
C3
---
A
C
B
D

 

따라서 두번째 표시될 값은 C이다.

반응형
Comments