
select 사원번호,사원명,입사일자,매니저번호
from 사원
start with 매니저번호 is null
connect by prior 사원번호 = 매니저번호
and 입사일자 between '2013-01-01' and '2013-12-31'
order siblings by 사원번호;
문제에서 이런식으로 테이블과 계층형 쿼리를 주고 정답을 추론해야 하는 문제는 SQLD 매 회차마다 적어도 한문제에서 두문제는 출제가 되는것 같습니다.절대 놓쳐서 안될 문제이고 누구도 이해하기 쉽게 설명을 하려고 글을 작성합니다.
계층형 쿼리를 읽는 순서
1. START WITH
from에서 테이블을 만들었다면 where조건이 아닌 start with인 시작행부터 봐야합니다.
위의 쿼리를 보게되면 '매니저번호 is null'이라는 조건이 되어있는데 테이블에서 매니저번호가 null인 데이터 행이 level1인 최상단 시작행이 되는것입니다. 테이블에서 찾아보면 '홍길동'과 '이병현' 두 사람을 찾을수 있습니다.
2. CONNECT BY
현재 시작행에서 '홍길동'과 '이병헌'을 찾앗습니다. 그렇다면 두 사람의 하위 계층을 찾아야하는 조건이 CONNECT BY입니다. 한 사람 '홍길동'부터 하나씩 진행해보면 CONNCET BY에 조건이 두개가 보이는데 하나씩 보겟습니다. 'prior 사원번호 = 매니저번호' 첫번째 조건에서 prior가 붙은 조건이 보이는데 여기서는 현재 '홍길동'의 데이터를 prior에 넣어주면 됩니다. 그렇게 값을 넣어보면 ' 1 = 매니저번호 ' 이렇게 볼 수 잇죠. 해당 조건에 만족하는 사람은 '강감찬', '이순신', '이민정' 세명을 찾을수 잇습니다. 이어서 두번째 조건인 입사일자 between '2013-01-01' and '2013-12-31' 은 첫번째 조건에서 구한 세명에 데이터중에서 입사일이 2013년인 사람을 찾으면 '이순신', '이민정' 입니다. '홍길동'을 통해 '이순신', '이민정'을 찾앗다면 계속해서 찾은 사람의 데이터를 갖고 CONNECT BY를 반복하시면 됩니다. 순서대로 '이순신'으로 CONNECT BY를 하게 되면 똑같이 첫번째 조건에서 prior가 붙은 컬럼에 '이순신'의 데이터를 넣어주면 ' 3 = 매니저번호 ' 조건으로 데이터를 찾게 되는거죠. 테이블에서 매니저번호가 3인 값은 없으므로 '이순신'의 자식계층은 없게 되고 이어 '이민정'으로 조건에 넣어보면 ' 4 = 매니저번호 ' 해당 조건에 만족하는 데이터도 없으니 '이민정'의 자식계층도 없고 결국 '홍길동'의 계층은 '홍길동' , '이순신', '이민정' 총 3명이 나옵니다. '홍길동'이 끝이낫다면 '이병헌'으로 위의 과정을 반복해주시면 됩니다.
모든 과정이 끝이 낫다면 계층형 쿼리에서 추출되는 데이터는 총 '홍길동', '이순신', '이민정', '이병헌' 4개의 데이터가 나올것입니다.
3. ORDER BY
위의 예제에서 계층데이터를 모두 찾앗다면 마지막으로 order by를 진행하셔야하는데 기존의 order by와 달리 siblings by라고 적혀잇는데 siblings by는 계층으로 구한 데이터를 정렬하는 방법입니다.

현재 계층은 이런식으로 구성되어 있습니다. 계층별로 정렬을 하게 된다면 홍길동 계층과 이병헌 계층으로 나뉘어 정렬을 하게 되는것이죠. 정렬조건이 사원번호의 오름차순이므로 홍길동 계층이 먼저 나오며 홍길동 자식인 이순신과 이민정을 홍길동 아래 오름차순하시면 됩니다. ( 만약 이순신에게 자식 계층이 잇다면 이순신 다음에 자식들을 다시 정렬을 한 뒤 이민정이 나올것입니다. ) 홍길동 계층이 끝이 낫다면 마지막으로 이병헌 계층을 정렬하면 최종적으로 저희가 원하는 데이터가 출력이 될 것입니다.

계층쿼리에서 where조건이 나와서 순서를 헷갈리시는 분이 많이 계신데 쿼리 모양이 from다음에 where다음에 start with라고 해서 from에서 가져온 데이터를 where로 조건을 걸러주고 start with로 구해야 할것같지만
from으로 데이터를 만든뒤 start with로 계층을 만들고 정렬을 하기 전에 where 조건을 걸어 계층데이터에서 걸러주면 됩니다.
'sqld' 카테고리의 다른 글
SQLD 조인 정리 (1) | 2024.10.29 |
---|---|
SQLD 사칙연산 (0) | 2024.10.29 |
SQLD 정렬 정리 (2) | 2024.10.29 |

select 사원번호,사원명,입사일자,매니저번호
from 사원
start with 매니저번호 is null
connect by prior 사원번호 = 매니저번호
and 입사일자 between '2013-01-01' and '2013-12-31'
order siblings by 사원번호;
문제에서 이런식으로 테이블과 계층형 쿼리를 주고 정답을 추론해야 하는 문제는 SQLD 매 회차마다 적어도 한문제에서 두문제는 출제가 되는것 같습니다.절대 놓쳐서 안될 문제이고 누구도 이해하기 쉽게 설명을 하려고 글을 작성합니다.
계층형 쿼리를 읽는 순서
1. START WITH
from에서 테이블을 만들었다면 where조건이 아닌 start with인 시작행부터 봐야합니다.
위의 쿼리를 보게되면 '매니저번호 is null'이라는 조건이 되어있는데 테이블에서 매니저번호가 null인 데이터 행이 level1인 최상단 시작행이 되는것입니다. 테이블에서 찾아보면 '홍길동'과 '이병현' 두 사람을 찾을수 있습니다.
2. CONNECT BY
현재 시작행에서 '홍길동'과 '이병헌'을 찾앗습니다. 그렇다면 두 사람의 하위 계층을 찾아야하는 조건이 CONNECT BY입니다. 한 사람 '홍길동'부터 하나씩 진행해보면 CONNCET BY에 조건이 두개가 보이는데 하나씩 보겟습니다. 'prior 사원번호 = 매니저번호' 첫번째 조건에서 prior가 붙은 조건이 보이는데 여기서는 현재 '홍길동'의 데이터를 prior에 넣어주면 됩니다. 그렇게 값을 넣어보면 ' 1 = 매니저번호 ' 이렇게 볼 수 잇죠. 해당 조건에 만족하는 사람은 '강감찬', '이순신', '이민정' 세명을 찾을수 잇습니다. 이어서 두번째 조건인 입사일자 between '2013-01-01' and '2013-12-31' 은 첫번째 조건에서 구한 세명에 데이터중에서 입사일이 2013년인 사람을 찾으면 '이순신', '이민정' 입니다. '홍길동'을 통해 '이순신', '이민정'을 찾앗다면 계속해서 찾은 사람의 데이터를 갖고 CONNECT BY를 반복하시면 됩니다. 순서대로 '이순신'으로 CONNECT BY를 하게 되면 똑같이 첫번째 조건에서 prior가 붙은 컬럼에 '이순신'의 데이터를 넣어주면 ' 3 = 매니저번호 ' 조건으로 데이터를 찾게 되는거죠. 테이블에서 매니저번호가 3인 값은 없으므로 '이순신'의 자식계층은 없게 되고 이어 '이민정'으로 조건에 넣어보면 ' 4 = 매니저번호 ' 해당 조건에 만족하는 데이터도 없으니 '이민정'의 자식계층도 없고 결국 '홍길동'의 계층은 '홍길동' , '이순신', '이민정' 총 3명이 나옵니다. '홍길동'이 끝이낫다면 '이병헌'으로 위의 과정을 반복해주시면 됩니다.
모든 과정이 끝이 낫다면 계층형 쿼리에서 추출되는 데이터는 총 '홍길동', '이순신', '이민정', '이병헌' 4개의 데이터가 나올것입니다.
3. ORDER BY
위의 예제에서 계층데이터를 모두 찾앗다면 마지막으로 order by를 진행하셔야하는데 기존의 order by와 달리 siblings by라고 적혀잇는데 siblings by는 계층으로 구한 데이터를 정렬하는 방법입니다.

현재 계층은 이런식으로 구성되어 있습니다. 계층별로 정렬을 하게 된다면 홍길동 계층과 이병헌 계층으로 나뉘어 정렬을 하게 되는것이죠. 정렬조건이 사원번호의 오름차순이므로 홍길동 계층이 먼저 나오며 홍길동 자식인 이순신과 이민정을 홍길동 아래 오름차순하시면 됩니다. ( 만약 이순신에게 자식 계층이 잇다면 이순신 다음에 자식들을 다시 정렬을 한 뒤 이민정이 나올것입니다. ) 홍길동 계층이 끝이 낫다면 마지막으로 이병헌 계층을 정렬하면 최종적으로 저희가 원하는 데이터가 출력이 될 것입니다.

계층쿼리에서 where조건이 나와서 순서를 헷갈리시는 분이 많이 계신데 쿼리 모양이 from다음에 where다음에 start with라고 해서 from에서 가져온 데이터를 where로 조건을 걸러주고 start with로 구해야 할것같지만
from으로 데이터를 만든뒤 start with로 계층을 만들고 정렬을 하기 전에 where 조건을 걸어 계층데이터에서 걸러주면 됩니다.
'sqld' 카테고리의 다른 글
SQLD 조인 정리 (1) | 2024.10.29 |
---|---|
SQLD 사칙연산 (0) | 2024.10.29 |
SQLD 정렬 정리 (2) | 2024.10.29 |