[SQL] 계층형 질의문 2

·2025년 7월 11일
0

SQL

목록 보기
105/126

문제1. 위의 슬라이드에 왼쪽에 나온 결과를 출력하시오

select rpad(' ', level*2) || ename as employee, level, sal, job
 from emp
 start with mgr is null		-- ename='KING'과 같음(KING의 mgr이 null값)
 connect by prior empno = mgr;

문제2. 문제1번의 결과를 다시 출력하는데 BLAKE와 BLAKE의 팀원들은 출력되지 않게하시오

select rpad(' ', level*2) || ename as employee, level, sal, job
 from emp
 start with mgr is null
 connect by prior empno = mgr and ename != 'BLAKE';

💡 where절을 쓰면 실행순서가 from - start with - connect by - where - select 라서 결과가 BLAKE만 빠짐
--> connect by절에 and를 써서 조건을 써줘야 됨

📌 계층형 질의문을 배울 때 꼭 알아야하는 내용 3가지

1. 가지치기(PRUNING) 하는 방법


문제3. 위의 결과를 다시 출력하는데 이번에는 BLAKE 와 BLAKE의 팀원들 뿐만아니라 JONES 와 JONES 의 팀원들도 모두 안나오게 하시오

select rpad(' ', level*2) || ename as employee, level, sal, job
 from emp
 start with mgr is null
 connect by prior empno = mgr
  and ename not in ('BLAKE', 'JONES');

not in 사용


문제4. MySQL로 접속해서 위의 SQL이 수행되는지 확인하시오

오라클 sql로는 안되고 다음과 같이 mysql용으로 작성

select version();

WITH RECURSIVE emp_hierarchy AS (
  -- Anchor member: top-level employee(s)
  SELECT 
    empno,
    ename,
    mgr,
    sal,
    job,
    1 AS level,
    LPAD(ename, LENGTH(ename) + 2, ' ') AS employee
  FROM emp
  WHERE mgr IS NULL
    AND ename NOT IN ('BLAKE', 'JONES')

  UNION ALL

  -- Recursive member
  SELECT 
    e.empno,
    e.ename,
    e.mgr,
    e.sal,
    e.job,
    eh.level + 1,
    CONCAT(RPAD(' ', (eh.level + 1) * 2, ' '), e.ename)
  FROM emp e
  JOIN emp_hierarchy eh ON e.mgr = eh.empno
  WHERE e.ename NOT IN ('BLAKE', 'JONES')
)

SELECT employee, level, sal, job
FROM emp_hierarchy;

0개의 댓글