ํ๋ก๊ทธ๋๋ฐ ๊ณต๋ถ/Oracle
[ex26] Hierarchical Query
๋์ฅ์ฟต์ผ
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;