ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • oracle 계층형 쿼리
    DataBase/oracle 2020. 3. 22. 03:13

     

    1) 이것을 테이블로 만들고 셀프조인을 하면

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /* 계층형 쿼리 : 오라클에서만 제공! */
     
    create table bom_sphone(
        item_id number(3not null,
        parent_id number(3),
        item_name varchar2(20not null,
        primary key(item_id)
    );
     
    insert into bom_sphone values(100null'스마트폰');
    insert into bom_sphone values(101100'메인pcb');
    insert into bom_sphone values(102100'배터리');
    insert into bom_sphone values(103101'cpu');
    insert into bom_sphone values(104101'메모리');
    insert into bom_sphone values(105101,'블루투스');
     
    select * from bom_sphone;
     
    -- self join :: 계층적으로는 보이지않음
    select s1.item_id,s1.item_name, s2.item_name parent_name
    from bom_sphone s1, bom_sphone s2
    where s1.parent_id = s2.item_id (+)
    order by s1.item_id;
     
     
    http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

     

    데이터의 계층이 직관적으로 보이지는 않음

    2) 계층형 쿼리인 

      start with

      connect by prior 을 사용하면 

     

    1
    2
    3
    4
    5
    6
    7
    8
     
    -- start with , connect by 절을 이용한 계층형 쿼리
    select lpad(' '2*(level -1)) || item_name itemnames
    from bom_sphone
    start with parent_id is null
    connect by prior item_id = parent_id; -- prior: 부모의 노드를 찾아서 connect 하는것! 
    --connect by parent_id = prior item_id ; -- 이렇게도 사용가능!
    -- join을 이용해서도 여러가지 응용해볼 수 있다!...

    1
    2
    3
    4
    5
    select level, lpad(' '4*(level-1)) || first_name || ' ' || last_name 
    from employees
    start with manager_id is null
    connect by manager_id = prior employee_id;
     
     
    http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

     

    3)  join을 이용하여 jobs 테이블에있는 job_title 도 같이 출력

    1
    2
    3
    4
    5
    6
    select  jb.job_title,
            lpad(' '4*(level-1)) || emp.first_name || ' ' || emp.last_name 
    from employees emp, jobs jb
    where emp.job_id = jb.job_id
    start with emp.manager_id is null
    connect by emp.manager_id = prior emp.employee_id;

    'DataBase > oracle' 카테고리의 다른 글

    oracle PL/SQL_변수 선언 및 데이터 타입  (0) 2020.03.22
    oracle PL/SQL_개념  (0) 2020.03.22
    oracle 시퀀스  (0) 2020.03.22
    oracle 뷰  (0) 2020.03.21
    oracle 제약조건  (0) 2020.03.21

    댓글

Designed by Tistory.