sql 계층 화 조회(START BY...CONNECT BY PRIOR)
--======================================================
--SQL 기반-->계층 화 조회(START BY...CONNECT BY PRIOR)
--======================================================
계층 화 조회,즉 트 리 구조 조회 로 SQL 에서 자주 사용 하 는 기능 중 하나 로 보통 뿌리 노드,부모 노드,서브 노드,잎 노드 로 구성 되 는데 그 문법 은 다음 과 같다.
SELECT [LEVEL] ,column,expression,...
FROM table_name
[WHERE where_clause]
[[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];
LEVEL: ,
start_condition:
prior_condition:
-- start with ...connect by prior
SQL> select empno,mgr,ename,job from emp
2 start with empno = 7839
3 connect by prior empno = mgr;
EMPNO MGR ENAME JOB
---------- ---------- ---------- ---------
7839 KING PRESIDENT
7566 7839 JONES MANAGER
7788 7566 SCOTT ANALYST
7876 7788 ADAMS CLERK
7902 7566 FORD ANALYST
7369 7902 SMITH CLERK
7698 7839 BLAKE MANAGER
7499 7698 ALLEN SALESMAN
7521 7698 WARD SALESMAN
7654 7698 MARTIN SALESMAN
7844 7698 TURNER SALESMAN
EMPNO MGR ENAME JOB
---------- ---------- ---------- ---------
7900 7698 JAMES CLERK
7782 7839 CLARK MANAGER
7934 7782 MILLER CLERK
트 리 구조 옮 겨 다 니 는 과정(위의 조 회 를 통 해 설명)
1).뿌리 노드 부터(즉 whereclause 의 조건,비 근 노드 라면 뿌리 노드 를 뿌리 노드 로 나 누 어 옮 겨 다 니 기 시작 합 니 다.예 를 들 어 empno=7839)
2).루트 노드 를 옮 겨 다 니 기(empno=7839 기록 에 관 한 정보 얻 기)
3).이 노드 에 하위 노드 가 존재 하 는 지 판단 하고 맨 왼쪽 에 접근 하지 않 은 하위 노드 를 방문 하여 이동 합 니 다).그렇지 않 으 면 다음 단계 입 니 다.
상례 와 같이 priorcondition 은 empno=mgr,즉 하위 노드 의 mgr 는 부모 노드 의 empno 와 같 습 니 다.이때 mgr 는 7839 의 기록 입 니 다.
4).노드 가 잎 노드 일 때 접근 이 완료 되 고 그렇지 않 으 면 이동)
5).이 노드 의 부모 노드 로 되 돌아 가 며 이동)
--위 열 level 사용
--connect by prior empno=mgr 의 이해 에 주의
--prior 는 이전 기록,즉 다음 기록 을 되 돌려 주 는 mgr 는 이전 기록 의 empno 와 같 아야 함 을 나타 낸다.
SQL> select level,empno,mgr,ename,job from emp
2 start with ename = 'KING'
3 connect by prior empno = mgr
4 order by level;
LEVEL EMPNO MGR ENAME JOB
---------- ---------- ---------- ---------- ---------
1 7839 KING PRESIDENT
2 7566 7839 JONES MANAGER
2 7698 7839 BLAKE MANAGER
2 7782 7839 CLARK MANAGER
3 7902 7566 FORD ANALYST
3 7521 7698 WARD SALESMAN
3 7900 7698 JAMES CLERK
3 7934 7782 MILLER CLERK
3 7499 7698 ALLEN SALESMAN
3 7788 7566 SCOTT ANALYST
3 7654 7698 MARTIN SALESMAN
LEVEL EMPNO MGR ENAME JOB
---------- ---------- ---------- ---------- ---------
3 7844 7698 TURNER SALESMAN
4 7876 7788 ADAMS CLERK
4 7369 7902 SMITH CLERK
--
SQL> select count(distinct level) "Level" from emp
2 start with ename = 'KING'
3 connect by prior empno = mgr;
Level
----------
4
-- ( * level - 1 )
SQL> col Ename for a30
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename",
3 job
4 from emp
5 start with ename = 'KING'
6 connect by prior empno = mgr;
LEVEL Ename JOB
---------- ------------------------------ ---------
1 KING PRESIDENT
2 JONES MANAGER
3 SCOTT ANALYST
4 ADAMS CLERK
3 FORD ANALYST
4 SMITH CLERK
2 BLAKE MANAGER
3 ALLEN SALESMAN
3 WARD SALESMAN
3 MARTIN SALESMAN
3 TURNER SALESMAN
LEVEL Ename JOB
---------- ------------------------------ ---------
3 JAMES CLERK
2 CLARK MANAGER
3 MILLER CLERK
-- ( start with )
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename",
3 job
4 from emp
5 start with ename = 'SCOTT'
6 connect by prior empno = mgr;
LEVEL Ename JOB
---------- ------------------------------ ---------
1 SCOTT ANALYST
2 ADAMS CLERK
--아래 에서 위로 옮 겨 다 니 기(connect by prior 의 조건 을 교환 하면 되 며 mgr=empno 를 사용)
--connect by prior mgr=empno 의 이해 에 주의 하 십시오--prior 는 이전 기록,즉 다음 기록 을 되 돌려 주 는 empno 는 이전 기록 의 mgr 와 같 아야 합 니 다.
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename",
3 job
4 from emp
5 start with ename = 'SCOTT'
6 connect by prior mgr = empno;
LEVEL Ename JOB
---------- ------------------------------ ---------
1 SCOTT ANALYST
2 JONES MANAGER
3 KING PRESIDENT
-- ( prior , )
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename",
3 job
4 from emp
5 start with ename = 'SCOTT'
6 connect by empno = prior mgr;
LEVEL Ename JOB
---------- ------------------------------ ---------
1 SCOTT ANALYST
2 JONES MANAGER
3 KING PRESIDENT
--
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename"
3 ,job
4 from emp
5 where ename != 'SCOTT' -- where SCOTT , SCOTT ADAMS
6 start with empno = 7839
7 connect by prior empno = mgr;
LEVEL Ename JOB
---------- -------------------- ---------
1 KING PRESIDENT
2 JONES MANAGER
4 ADAMS CLERK
3 FORD ANALYST
4 SMITH CLERK
2 BLAKE MANAGER
3 ALLEN SALESMAN
3 WARD SALESMAN
3 MARTIN SALESMAN
3 TURNER SALESMAN
3 JAMES CLERK
LEVEL Ename JOB
---------- -------------------- ---------
2 CLARK MANAGER
3 MILLER CLERK
--필터 조건 을 where 자구 의 내용 에서 connect by prior 자구 로 이동 시 켜 SCOTT 및 그 부 하 를 걸 러 낸다
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename"
3 ,job
4 from emp
5 start with empno = 7839
6 connect by prior empno = mgr and ename != 'SCOTT';
LEVEL Ename JOB
---------- -------------------- ---------
1 KING PRESIDENT
2 JONES MANAGER
3 FORD ANALYST
4 SMITH CLERK
2 BLAKE MANAGER
3 ALLEN SALESMAN
3 WARD SALESMAN
3 MARTIN SALESMAN
3 TURNER SALESMAN
3 JAMES CLERK
2 CLARK MANAGER
LEVEL Ename JOB
---------- -------------------- ---------
3 MILLER CLERK
--계층 적 조회 에 필터 조건 을 추가 하거나 하위 조 회 를 사용 하 는 경우
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename"
3 ,job
4 from emp
5 where sal > 2500
6 start with empno = 7839
7 connect by prior empno = mgr
8 ;
LEVEL Ename JOB
---------- -------------------- ---------
1 KING PRESIDENT
2 JONES MANAGER
3 SCOTT ANALYST
3 FORD ANALYST
2 BLAKE MANAGER
SQL> select level,
2 lpad(' ',2 * level - 1) || ename as "Ename"
3 ,job
4 from emp
5 where sal > (select avg(sal) from emp)
6 start with empno = 7839
7 connect by prior empno = mgr ;
LEVEL Ename JOB
---------- -------------------- ---------
1 KING PRESIDENT
2 JONES MANAGER
3 SCOTT ANALYST
3 FORD ANALYST
2 BLAKE MANAGER
2 CLARK MANAGER
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 스레드에서 start와 run 방법의 전면적인 해석사용자 정의 스레드 두 가지 방법 runnable 인터페이스의 실현 클래스를 사용자 정의한 다음thread를 구성합니다. 즉thread에 runnable 인터페이스 클래스를 전달합니다. newthread나thread...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.