๋Œ€์žฅ์ฟต์•ผ 2023. 3. 30. 13:54

ex26_hierarchical
    
    ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ, Hierarchical Query
    - ์˜ค๋ผํด ์ „์šฉ
    - ๋ ˆ์ฝ”๋“œ ๊ด€๊ณ„๊ฐ€ ์„œ๋กœ ์ƒํ•˜ ์ˆ˜์ง ๊ตฌ์กฐ์ผ๋•Œ ์‚ฌ์šฉ
    - ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์ˆ˜์ง ๊ตฌ์กฐ์ผ๋•Œ ์‚ฌ์šฉ
    - ์ž๊ธฐ ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉ 
    - ex) ์นดํ…Œ๊ณ ๋ฆฌ, ๋‹ต๋ณ€ํ˜• ๊ฒŒ์‹œํŒ, ์กฐ์ง๋„ ๋“ฑ.. ํŠธ๋ฆฌ ๊ตฌ์กฐ์— ์‚ฌ์šฉ
    
    ์ปดํ“จํ„ฐ
        - ๋ณธ์ฒด
            - ๋ฉ”์ธ๋ณด๋“œ
            - ๊ทธ๋ž˜ํ”ฝ์นด๋“œ
            - CPU
            - ๋ฉ”๋ชจ๋ฆฌ
        - ๋ชจ๋‹ˆํ„ฐ
            - ๋ชจ๋‹ˆํ„ฐ์•”
            - ๋ณดํ˜ธํ•„๋ฆ„

 

-- Case 1.
create table tblComputer (
    seq number primary key,                                --์‹๋ณ„์ž(PK)
    name varchar2(50) not null,                            --๋ถ€ํ’ˆ๋ช…
    qty number not null,                                   --์ˆ˜๋Ÿ‰
    pseq number null references tblComputer(seq)           --๋ถ€๋ชจ๋ถ€ํ’ˆ(FK)
    
);

insert into tblComputer values (1, '์ปดํ“จํ„ฐ', 1, null);

insert into tblComputer values (2, '๋ณธ์ฒด', 1, 1);
insert into tblComputer values (3, '๋ฉ”์ธ๋ณด๋“œ', 1, 2);
insert into tblComputer values (4, '๊ทธ๋ž˜ํ”ฝ์นด๋“œ', 1, 2);
insert into tblComputer values (5, 'CPU', 1, 2);
insert into tblComputer values (6, '๋ฉ”๋ชจ๋ฆฌ', 2, 2);

insert into tblComputer values (7, '๋ชจ๋‹ˆํ„ฐ', 1, 1);
insert into tblComputer values (8, '๋ชจ๋‹ˆํ„ฐ์•”', 1, 7);
insert into tblComputer values (9, '๋ณดํ˜ธํ•„๋ฆ„', 1, 7);




-- Case 2.
-- ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ ๋ชป์”€(์ž๊ธฐ์ฐธ์กฐํ˜•์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
create table tblCategoryBig (
    seq number primary key,                 --์‹๋ณ„์ž(PK)
    name varchar2(100) not null             --์นดํ…Œ๊ณ ๋ฆฌ๋ช…
);

create table tblCategoryMedium (
    seq number primary key,                             --์‹๋ณ„์ž(PK)
    name varchar2(100) not null,                        --์นดํ…Œ๊ณ ๋ฆฌ๋ช…
    pseq number not null references tblCategoryBig(seq) --๋ถ€๋ชจ์นดํ…Œ๊ณ ๋ฆฌ(FK)
);

create table tblCategorySmall (
    seq number primary key,                                 --์‹๋ณ„์ž(PK)
    name varchar2(100) not null,                            --์นดํ…Œ๊ณ ๋ฆฌ๋ช…
    pseq number not null references tblCategoryMedium(seq)  --๋ถ€๋ชจ์นดํ…Œ๊ณ ๋ฆฌ(FK)
);


insert into tblCategoryBig values (1, '์นดํ…Œ๊ณ ๋ฆฌ');

insert into tblCategoryMedium values (1, '์ปดํ“จํ„ฐ์šฉํ’ˆ', 1);
insert into tblCategoryMedium values (2, '์šด๋™์šฉํ’ˆ', 1);
insert into tblCategoryMedium values (3, '๋จน๊ฑฐ๋ฆฌ', 1);

insert into tblCategorySmall values (1, 'ํ•˜๋“œ์›จ์–ด', 1);
insert into tblCategorySmall values (2, '์†Œํ”„ํŠธ์›จ์–ด', 1);
insert into tblCategorySmall values (3, '์†Œ๋ชจํ’ˆ', 1);

insert into tblCategorySmall values (4, 'ํ…Œ๋‹ˆ์Šค', 2);
insert into tblCategorySmall values (5, '๊ณจํ”„', 2);
insert into tblCategorySmall values (6, '๋‹ฌ๋ฆฌ๊ธฐ', 2);

insert into tblCategorySmall values (7, '๋ฐ€ํ‚คํŠธ', 3);
insert into tblCategorySmall values (8, '๋ฒ ์ด์ปค๋ฆฌ', 3);
insert into tblCategorySmall values (9, '๋„์‹œ๋ฝ', 3);



-- Case 1.
-- tblComputer
-- 1. ์กฐ์ธ
select
    c1.name as "๋ถ€ํ’ˆ๋ช…",
    c2.name as "๋ถ€๋ชจ๋ถ€ํ’ˆ๋ช…"
from tblComputer c1
    inner join tblComputer c2
    
        on            c2.seq = c1.pseq;
      --connect by prior seq = pseq; (์œ„๋ž‘ ๊ฐ™์€ ์—ญํ• )

-- 2. ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ
/*
    
    ๊ตฌ๋ฌธ
    - start with์ ˆ + connect by์ ˆ
    
    ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ ์˜์‚ฌ ์ปฌ๋Ÿผ
    a. prior > ์ž๊ธฐ์™€ ์—ฐ๊ด€๋œ ๋ถ€๋ชจ ๋ ˆ์ฝ”๋“œ ์ฐธ์กฐ
    b. level > ์„ธ๋Œ€์ˆ˜(depth) 

*/

select
    seq,
    lpad(' ', (level-1) * 5) || name, --level ์‚ฌ์šฉํ•ด์„œ ์‹œ๊ฐ์ ํšจ๊ณผ
    prior name,
    level
from tblComputer
    --start with seq = 1 --๊ฒฐ๊ณผ์…‹์˜ ๋ฃจํŠธ ์ง€์ •
    --start with seq = 7 --๋ชจ๋‹ˆํ„ฐ ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ด
    --start with seq = (select seq from tblComputer where name = '๋ณธ์ฒด') --๋ณธ์ฒด๋งŒ ๊ฐ€์ ธ์˜ด
    start with pseq is null --์ตœ์ƒ์œ„ ๊ณ„์ธต ๊ฐ€์ ธ์˜ด
        connect by prior seq = pseq; --ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ์™€ ๋ถ€๋ชจ ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐ(์กฐ์ธ on ์—ญํ• )

select * from tblSelf;

select 
    lpad(' ', (level-1) * 2) || name as "์ง์›๋ช…"
from tblSelf
    start with seq = 1
        connect by super = prior seq;

------------------

select * from tblCategoryBig;
select * from tblCategoryMedium where pseq = 1;
select * from tblCategorySmall where pseq = 2;

--๊ฒฐ๊ณผ์—์„œ ์ƒ์œ„ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฐ˜๋ณต ์‹ซ์œผ๋ฉด select 3๋ฒˆ ํ•ด์•ผ๋จ. joinํ•˜๋ฉด ์ค‘๋ณต์€ ํ•„์—ฐ
select
    *
from tblCategoryBig b
    inner join tblCategoryMedium m
        on b.seq = m.pseq
            inner join tblCategorySmall s
                on m.seq = s.pseq;