[ORACLE] CONNECT BY 함수 사용하기

2018. 7. 24. 15:27· Database/Oracle

ORACLE 에서는 계층데이터를 위해 CONNECT BY 절을 지원합니다.



CONNECT BY 구성


CONNECT BY 는 아래의 3개의 구문으로 구성됩니다.


 구문

 설명

 WHERE

 데이터를 가져온 뒤 마지막으로 조건절에 맞게 정리

 START WITH

 어떤 데이터로 계층구조를 지정하는지 지정

 CONNECT BY 각 행들의 연결 관계를 설정


* START WITH 는 가장 처음에 데이터를 거르는 플랜을 타게 되고, 따라서 이 컬럼에는 인덱스가 걸려있어야 성능을 보장받습니다.

* CONNECT BY 절의 결과에는 LEVEL 이라는 컬럼이 있으며, 이는 계층의 깊이를 의미합니다.



CONNECT BY 사용하기


먼저 EMP 테이블에 데이터가 아래와 같이 있습니다.

SQL> SELECT * FROM EMP;

     EMPNO ENAME                          JOB                                MGR HIREDATE        SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- -------- ---------- ---------- ----------
      7839 KING                           PRESIDENT                              81/11/17       5000                    10
      7698 BLAKE                          MANAGER                           7839 81/05/01       2850                    30
      7782 CLARK                          MANAGER                           7839 81/06/09       2450                    10
      7566 JONES                          MANAGER                           7839 81/04/02       2975                    20
      7902 FORD                           ANALYST                           7566 81/12/03       3000                    20
      7369 SMITH                          CLERK                             7902 80/12/17        800                    20
      7499 ALLEN                          SALESMAN                          7698 81/02/20       1600        300         30
      7521 WARD                           SALESMAN                          7698 81/02/22       1250        500         30
      7654 MARTIN                         SALESMAN                          7698 81/09/28       1250       1400         30
      7844 TURNER                         SALESMAN                          7698 81/09/08       1500          0         30
      7900 JAMES                          CLERK                             7698 81/12/03        950                    30
      7934 MILLER                         CLERK                             7782 82/01/23       1300                    10

12 행이 선택되었습니다.


CONNECT BY 구문을 써서 쿼리를 수행시킨 결과는 다음과 같습니다.

아래의 쿼리는 JOB = PRESIDENT 를 기준으로 ( 계층의 LEVEL 1 ), EMPNO 와 MGR 이 같은 관계를 계층적으로 출력합니다.

SQL> SELECT LEVEL, EMPNO, ENAME, MGR, JOB FROM EMP START WITH JOB = 'PRESIDENT' CONNECT BY PRIOR EMPNO = MGR;

LEVEL EMPNO ENAME MGR JOB ---------- ---------- ------------------------------ ---------- --------------------------- 1 7839 KING PRESIDENT 2 7566 JONES 7839 MANAGER 3 7902 FORD 7566 ANALYST 4 7369 SMITH 7902 CLERK 2 7698 BLAKE 7839 MANAGER 3 7499 ALLEN 7698 SALESMAN 3 7521 WARD 7698 SALESMAN 3 7654 MARTIN 7698 SALESMAN 3 7844 TURNER 7698 SALESMAN 3 7900 JAMES 7698 CLERK 2 7782 CLARK 7839 MANAGER 3 7934 MILLER 7782 CLERK 12 행이 선택되었습니다.


깊이가 깊어지는 경우 LEVEL 을 조건절에 걸어서 원하는 깊이까지만 볼 수 있습니다.

SQL> SELECT LEVEL, EMPNO, ENAME, MGR, JOB FROM EMP START WITH JOB = 'PRESIDENT' CONNECT BY PRIOR EMPNO = MGR AND LEVEL <= 3; LEVEL EMPNO ENAME MGR JOB ---------- ---------- ------------------------------ ---------- --------------------------- 1 7839 KING PRESIDENT 2 7566 JONES 7839 MANAGER 3 7902 FORD 7566 ANALYST 2 7698 BLAKE 7839 MANAGER 3 7499 ALLEN 7698 SALESMAN 3 7521 WARD 7698 SALESMAN 3 7654 MARTIN 7698 SALESMAN 3 7844 TURNER 7698 SALESMAN 3 7900 JAMES 7698 CLERK 2 7782 CLARK 7839 MANAGER 3 7934 MILLER 7782 CLERK 11 행이 선택되었습니다.


혹은 LEVEL 의 깊이가 3이하이며, EMPNO 가 7500 보다 큰 데이터만도 볼수 있습니다.

SQL> SELECT LEVEL, EMPNO, ENAME, MGR, JOB
FROM EMP
WHERE EMPNO > 7500
START WITH JOB = 'PRESIDENT'
CONNECT BY PRIOR EMPNO = MGR AND LEVEL <= 3;

     LEVEL      EMPNO ENAME                                 MGR JOB
---------- ---------- ------------------------------ ---------- ---------------------------
         1       7839 KING                                      PRESIDENT
         2       7566 JONES                                7839 MANAGER
         3       7902 FORD                                 7566 ANALYST
         2       7698 BLAKE                                7839 MANAGER
         3       7521 WARD                                 7698 SALESMAN
         3       7654 MARTIN                               7698 SALESMAN
         3       7844 TURNER                               7698 SALESMAN
         3       7900 JAMES                                7698 CLERK
         2       7782 CLARK                                7839 MANAGER
         3       7934 MILLER                               7782 CLERK

10 행이 선택되었습니다.


저작자표시 비영리 변경금지

'Database > Oracle' 카테고리의 다른 글

[ORACLE] ORA-01001: invalid cursor 해결하기  (0) 2018.08.02
[ORACLE] SQL-02122: Invalid OPEN or PREPARE for this database connection 해결하기  (0) 2018.07.27
[ORACLE] SQL 의 자주쓰는 명령어 모음  (0) 2018.07.24
[ORACLE] 컬럼의 데이터가 아래줄에 출력될 때, 데이터 출력 화면 조정하기  (0) 2018.06.18
[ORACLE] Linux 에 ORACLE 서버 설치하기  (0) 2018.06.18
'Database/Oracle' 카테고리의 다른 글
  • [ORACLE] ORA-01001: invalid cursor 해결하기
  • [ORACLE] SQL-02122: Invalid OPEN or PREPARE for this database connection 해결하기
  • [ORACLE] SQL 의 자주쓰는 명령어 모음
  • [ORACLE] 컬럼의 데이터가 아래줄에 출력될 때, 데이터 출력 화면 조정하기
꽁담
꽁담
'DBA 업무'와 '알게되는 정보'를 기록하는 공간
꽁담'DBA 업무'와 '알게되는 정보'를 기록하는 공간
꽁담
꽁담
꽁담
글쓰기
방명록
관리
방문 수
오늘
어제

카테고리

  • 분류 전체보기 (622)
    • 일상 (0)
      • 좋은글 (0)
    • Windows (37)
    • SQL Server (119)
      • SQL Server 자주보는 (18)
      • SQL Server 이중화_백업 (11)
      • SQL Server 기본기 (4)
      • SQL Server 이슈 (23)
      • SQL Server 기타 (63)
    • Database (260)
      • DBA 의 개인생각 (21)
      • 개념 (28)
      • MySQL (21)
      • Oracle (13)
      • PostgreSQL (17)
      • Redis (31)
      • Goldilocks (83)
      • MongoDB (31)
      • MongoDB 실습 (15)
    • Computer Language (113)
      • C (17)
      • JAVA (71)
      • Android (18)
      • Python (7)
    • Linux (41)
      • 개념 (22)
      • 명령어 (14)
      • 실습하기 (5)
    • AWS (31)
      • S3 (3)
      • RDS (7)
      • EC2 (11)
      • 기타 (10)
    • 자격증 (1)
    • 엑셀 (2)
    • 후기 (17)

블로그 메뉴

  • 방명록

공지사항

인기 글

태그

  • SQL Server
  • mysql
  • AWS
  • Android
  • 데이터베이스
  • Java
  • C
  • 안드로이드
  • Oracle
  • MS-SQL
  • Linux
  • 골디락스
  • MongoDB
  • msSQL
  • 리눅스
  • 자바
  • goldilocks
  • Database
  • Goldilocks DBMS
  • postgresql

최근 댓글

hELLO · Designed By 정상우.v4.2.2
꽁담
[ORACLE] CONNECT BY 함수 사용하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.