κ³μΈ΅ν 쿼리
κ³μΈ΅μ μΈ λ°μ΄ν° ꡬ쑰μμ λΆλͺ¨-μμ κ΄κ³λ₯Ό κ°μ§ λ°μ΄ν°λ₯Ό κ²μνκ±°λ μ‘°μνλ 쿼리
λ¬Έλ²
SELECT [ννμλ€]
FROM [ν
μ΄λΈλͺ
]
START WITH [μμ 쑰건]
CONNECT BY [μ¬κ· 쑰건];
SQL
볡μ¬
κΈ°λ³Έ κ΅¬μ± μμ
ꡬ문 | μ€λͺ
|
SELECT [ννμλ€] | μ‘°νν μ΄μ μ§μ ν©λλ€.
κ³μΈ΅ ꡬ쑰λ₯Ό νννκΈ° μν μ΄κ³Ό μΆκ°μ μΈ μ΄μ΄ ν¬ν¨λ μ μμ΅λλ€. |
FROM [ν
μ΄λΈλͺ
] | κ³μΈ΅ν 쿼리λ₯Ό μνν λμ ν
μ΄λΈμ μ§μ ν©λλ€. |
START WITH [μμ 쑰건] | κ³μΈ΅ ꡬ쑰μ μμμ μ μ μν©λλ€.
μ§μ λ 쑰건μ λ§μ‘±νλ νμ΄ μμμ μ΄ λ©λλ€. |
CONNECT BY [μ¬κ· 쑰건] | μ¬κ·μ μΈ κ΄κ³λ₯Ό μ μν©λλ€.
μ§μ λ 쑰건μ λ§μ‘±νλ νμ΄ μ΄μ νκ³Ό μ°κ²°λμ΄ κ³μΈ΅ ꡬ쑰λ₯Ό νμ±ν©λλ€. |
PRIOR | CONNECT BY μ κ³Ό ν¨κ» μ¬μ©λλ©°, μ΄μ νμ μλ―Ένλ ν€μλμ΄λ€.
|
CONNECT BY ν€μλ
ν€μλ λ° ν¨μ | μ€λͺ
|
CONNECT BY | κ³μΈ΅μ 쿼리λ₯Ό μ μνκΈ° μν ν€μλλ‘, λΆλͺ¨-μμ κ°μ κ΄κ³λ₯Ό μ§μ ν©λλ€. |
LEVEL | νμ¬ νμ κ³μΈ΅ λ 벨μ λνλ΄λ μμ¬ μ΄μ
λλ€. |
CONNECT_BY_ROOT | κ³μΈ΅ ꡬ쑰μμ μ΅μμ λΆλͺ¨λ₯Ό λνλ΄λ μμ¬ μ΄μ
λλ€. |
CONNECT_BY_ISLEAF | νμ¬ νμ΄ λ¦¬ν(λ§λ¨) λ
ΈλμΈμ§ μ¬λΆλ₯Ό νλ³νλ μμ¬ μ΄μ
λλ€. |
SYS_CONNECT_BY_PATH | κ³μΈ΅μ 쿼리μμ νμ κ²½λ‘λ₯Ό λνλ΄λ ν¨μμ
λλ€. |
NOCYCLE | μν(cycle)μ λ°©μ§νκΈ° μν μ΅μ
μ
λλ€. |
CONNECT_BY_ISCYCLE | νμ¬ νμ΄ μν ꡬ쑰μ μλμ§ μ¬λΆλ₯Ό νλ³νλ μμ¬ μ΄μ
λλ€. |
ORDER BY SIBLINGS BY μ»¬λΌ | κ°μ LEVEL λ
Έλ μ¬μ΄μμ μ λ ¬μ μνν©λλ€. |
κ³μΈ΅ν μΏΌλ¦¬λ‘ μ‘°μ§λλ₯Ό μΆλ ₯νλ μμ μ½λ
SELECT LEVEL
, employee_id
, first_name
, last_name
, job_id
, manager_id
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
SQL
볡μ¬
β’
START WITH manager_id IS NULL: μ΅μμ λΆμμ μ§μλ€μ μ νν©λλ€. μ¬κΈ°μλ μ΅μμ μ§μμ΄ λ§€λμ κ° μλ μ§μλ€μ
λλ€.
β’
CONNECT BY PRIOR employee_id = manager_id: κ° νμ μ΄μ νκ³Ό μ°κ²°ν©λλ€. μ΄μ ν(PRIOR)μ employee_idκ° νμ¬ νμ manager_idμ κ°μ κ²½μ°, κ³μΈ΅μ μΌλ‘ μ°κ²°λ©λλ€.
β’
LEVEL: κ° νμ κ³μΈ΅ λ 벨μ λνλ
λλ€.
β¦
1 : λν
β¦
2 : λΆμμ₯ (μμ¬)
β¦
3 : μ§μ (λΆν)
CONNECT BYλ₯Ό νμ©ν λλκΈ κ΅¬μ‘° μμ
λλκΈ ν μ΄λΈ μμ± λ° μν λ°μ΄ν°
-- DDL
CREATE TABLE board (
no NUMBER NOT NULL,
title varchar2(100) NOT NULL,
writer varchar2(100) NOT NULL,
content varchar2(1000),
reg_date DATE DEFAULT sysdate NOT NULL,
upd_date DATE DEFAULT sysdate NOT NULL,
views NUMBER DEFAULT 0 NOT NULL,
PRIMARY KEY (no)
);
CREATE TABLE comments (
comment_id NUMBER NOT NULL,
board_no NUMBER NOT NULL,
parent_comment_id NUMBER,
writer VARCHAR2(100) NOT NULL,
content VARCHAR2(1000) NOT NULL,
reg_date DATE DEFAULT sysdate NOT NULL,
PRIMARY KEY (comment_id),
FOREIGN KEY (parent_comment_id) REFERENCES comments(comment_id)
);
-- μν λ°μ΄ν°
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (1, 1, NULL, 'μ¬μ©μ1', '첫 λ²μ§Έ λκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (2, 1, 1, 'μ¬μ©μ2', '첫 λ²μ§Έ λκΈμ λν λλκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (3, 1, 1, 'μ¬μ©μ3', '첫 λ²μ§Έ λκΈμ λν λ λ€λ₯Έ λλκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (4, 1, 2, 'μ¬μ©μ4', 'λλκΈμ λν λλκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (5, 1, NULL, 'μ¬μ©μ5', 'λ λ²μ§Έ λκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (6, 1, 5, 'μ¬μ©μ6', 'λ λ²μ§Έ λκΈμ λν λλκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (7, 1, NULL, 'μ¬μ©μ7', 'μΈ λ²μ§Έ λκΈμ
λλ€.');
INSERT INTO comments (comment_id, board_no, parent_comment_id, writer, content) VALUES (8, 1, 3, 'μ¬μ©μ8', '첫 λ²μ§Έ λκΈμ λλκΈμ λν λ΅κΈμ
λλ€.');
SQL
볡μ¬
κ³μΈ΅ν μΏΌλ¦¬λ‘ λλκΈ κ΅¬μ‘° μ‘°ν
SELECT LEVEL,
LPAD(' ', (LEVEL-1)*4) || writer AS writer,
comment_id,
parent_comment_id,
content,
reg_date
FROM comments
WHERE board_no = 1
START WITH parent_comment_id IS NULL
CONNECT BY PRIOR comment_id = parent_comment_id
ORDER SIBLINGS BY comment_id;
SQL
볡μ¬
β’
START WITH parent_comment_id IS NULL: μ΅μμ λκΈ(λΆλͺ¨ λκΈμ΄ μλ λκΈ)μ μμμ μΌλ‘ μ§μ ν©λλ€.
β’
CONNECT BY PRIOR comment_id = parent_comment_id: μ΄μ νμ comment_idκ° νμ¬ νμ parent_comment_idμ κ°μ κ²½μ° κ³μΈ΅μ μΌλ‘ μ°κ²°λ©λλ€.
β’
LPAD(' ', (LEVEL-1)*4): κ³μΈ΅ λ 벨μ λ°λΌ λ€μ¬μ°κΈ°λ₯Ό μ μ©νμ¬ λλκΈ κ΅¬μ‘°λ₯Ό μκ°μ μΌλ‘ ννν©λλ€.
β’
ORDER SIBLINGS BY comment_id: κ°μ λ 벨μ λκΈλ€μ comment_id μμλ‘ μ λ ¬ν©λλ€.
κ²°κ³Ό μμ
LEVEL | WRITER | COMMENT_ID | PARENT_COMMENT_ID | CONTENT |
1 | μ¬μ©μ1 | 1 | NULL | 첫 λ²μ§Έ λκΈμ
λλ€. |
2 | μ¬μ©μ2 | 2 | 1 | 첫 λ²μ§Έ λκΈμ λν λλκΈμ
λλ€. |
3 | μ¬μ©μ4 | 4 | 2 | λλκΈμ λν λλκΈμ
λλ€. |
2 | μ¬μ©μ3 | 3 | 1 | 첫 λ²μ§Έ λκΈμ λν λ λ€λ₯Έ λλκΈμ
λλ€. |
3 | μ¬μ©μ8 | 8 | 3 | 첫 λ²μ§Έ λκΈμ λλκΈμ λν λ΅κΈμ
λλ€. |
1 | μ¬μ©μ5 | 5 | NULL | λ λ²μ§Έ λκΈμ
λλ€. |
2 | μ¬μ©μ6 | 6 | 5 | λ λ²μ§Έ λκΈμ λν λλκΈμ
λλ€. |
1 | μ¬μ©μ7 | 7 | NULL | μΈ λ²μ§Έ λκΈμ
λλ€. |
κ²½λ‘ νμνκΈ° (SYS_CONNECT_BY_PATH μ¬μ©)
SELECT LEVEL,
comment_id,
parent_comment_id,
writer,
content,
SYS_CONNECT_BY_PATH(writer, ' β ') AS path
FROM comments
WHERE board_no = 1
START WITH parent_comment_id IS NULL
CONNECT BY PRIOR comment_id = parent_comment_id
ORDER SIBLINGS BY comment_id;
SQL
볡μ¬
β’
SYS_CONNECT_BY_PATH(writer, ' β '): κ³μΈ΅ ꡬ쑰μ κ²½λ‘λ₯Ό νμν©λλ€. μ΅μμ λκΈλΆν° νμ¬ λκΈκΉμ§μ μμ±μλ₯Ό νμ΄νλ‘ μ°κ²°νμ¬ λ³΄μ¬μ€λλ€.
λ£¨νΈ λκΈ μ 보 κ°μ Έμ€κΈ° (CONNECT_BY_ROOT μ¬μ©)
SELECT LEVEL,
comment_id,
parent_comment_id,
writer,
content,
CONNECT_BY_ROOT comment_id AS root_comment_id,
CONNECT_BY_ROOT writer AS root_writer
FROM comments
WHERE board_no = 1
START WITH parent_comment_id IS NULL
CONNECT BY PRIOR comment_id = parent_comment_id
ORDER SIBLINGS BY comment_id;
SQL
볡μ¬
β’
CONNECT_BY_ROOT comment_id: ν΄λΉ λκΈμ΄ μν μ΅μμ λκΈμ IDλ₯Ό λ°νν©λλ€.
β’
CONNECT_BY_ROOT writer: ν΄λΉ λκΈμ΄ μν μ΅μμ λκΈμ μμ±μλ₯Ό λ°νν©λλ€.
λ§λ¨ λκΈ νμΈνκΈ° (CONNECT_BY_ISLEAF μ¬μ©)
SELECT LEVEL,
comment_id,
parent_comment_id,
writer,
content,
CONNECT_BY_ISLEAF AS is_leaf
FROM comments
WHERE board_no = 1
START WITH parent_comment_id IS NULL
CONNECT BY PRIOR comment_id = parent_comment_id
ORDER SIBLINGS BY comment_id;
SQL
볡μ¬
β’
CONNECT_BY_ISLEAF: νμ¬ λκΈμ΄ λ§λ¨ λκΈ(μμμ΄ μλ λκΈ)μΈ κ²½μ° 1μ, κ·Έλ μ§ μμΌλ©΄ 0μ λ°νν©λλ€.


