1. 문제목적
트리 구조 데이터를 SQL로 탐색하는 방법을 학습하는 것이다.
- NULL 값의 처리 방법.
- 테이블 조인(Join)을 통해 관련 데이터를 가져오는 방법.
- ORDER BY 절을 이용한 결과 정렬.
2. 핵심개념
NULL 값
- 정의: NULL은 값이 없는 상태를 나타내며 부모-자식 관계에서 최상위(Root) 노드를 나타내는 데 자주 사용된다.
- SQL에서 IS NULL 조건을 사용해 NULL 값을 확인할 수 있다.
JOIN
- 정의: 두 개 이상의 테이블을 연결하여 데이터를 조회하는 데 사용된다.
- 종류: INNER JOIN, LEFT JOIN, RIGHT JOIN 등이 있으며, 여기서는 INNER JOIN을 사용한다.
SELECT columns
FROM table1
JOIN table2 ON table1.column = table2.column;
ORDER BY
- 정의: 데이터를 특정 열을 기준으로 정렬하는 데 사용된다.
- 기본적으로 오름차순(ASC), 내림차순(DESC)을 지정할 수 있다.
SELECT columns
FROM table
ORDER BY column ASC;
3. 문제해결 절차
- 문제 이해
- ROOT 아이템은 부모 아이템 ID(PARENT_ITEM_ID)가 NULL인 레코드다.
- ROOT 아이템의 ID와 이름을 출력해야 하며, 결과는 ID 기준으로 오름차순 정렬해야 한다.
- 테이블 관계 파악
- ITEM_TREE 테이블에서 부모-자식 관계를 나타내는 PARENT_ITEM_ID를 확인.
- ITEM_INFO 테이블에서 각 아이템의 이름과 ID를 가져옴.
- 필요한 데이터 추출
- ITEM_TREE 테이블에서 PARENT_ITEM_ID가 NULL인 레코드만 선택.
- 선택된 레코드의 ITEM_ID를 기준으로 ITEM_INFO 테이블에서 이름(ITEM_NAME)을 조회.
- 결과 정렬
- 결과를 ITEM_ID 기준으로 오름차순 정렬.
4. 코드작성
-- ROOT 아이템을 조회하는 SQL 문
SELECT
T.ITEM_ID, -- ROOT 아이템의 ID
I.ITEM_NAME -- ROOT 아이템의 이름
FROM
ITEM_TREE T -- 트리 구조를 나타내는 ITEM_TREE 테이블
JOIN
ITEM_INFO I -- 아이템 정보를 포함한 ITEM_INFO 테이블
ON
T.ITEM_ID = I.ITEM_ID -- ITEM_ID를 기준으로 두 테이블을 조인
WHERE
T.PARENT_ITEM_ID IS NULL -- 부모 ID가 NULL인 ROOT 아이템만 선택
ORDER BY
T.ITEM_ID ASC; -- ITEM_ID 기준으로 오름차순 정렬
5. 코드분석
1) SELECT
- T.ITEM_ID와 I.ITEM_NAME을 조회:ITEM_NAME: ROOT 아이템의 이름.
- ITEM_ID: ROOT 아이템의 고유 식별자.
2) FROM과 JOIN
- ITEM_TREE와 ITEM_INFO 테이블을 ITEM_ID 열을 기준으로 조인:ITEM_INFO는 아이템의 상세 정보를 제공.
- ITEM_TREE는 부모-자식 관계를 나타내고, PARENT_ITEM_ID가 NULL인 ROOT 아이템을 선택.
3) WHERE 조건
- T.PARENT_ITEM_ID IS NULL 조건을 사용하여 부모가 없는 아이템(즉, ROOT 아이템)을 필터링.
4) ORDER BY
- 결과를 ITEM_ID 기준으로 오름차순 정렬하여 ID가 작은 순서대로 출력.
'SQL Kit > IS NULL' 카테고리의 다른 글
NULL 처리하기 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.05 |
---|---|
잡은 물고기의 평균 길이 구하기 [ 프로그래머스 | SQL Kit | Level 1 ] (0) | 2025.03.03 |
나이 정보가 없는 회원 수 구하기 [ 프로그래머스 | SQL Kit | Level 1 ] (0) | 2025.03.03 |
이름이 없는,있는 동물의 아이디 [ 프로그래머스 | SQL Kit | Level 1 ] (0) | 2025.03.03 |
경기도에 위치한 식품창고 목록 출력하기 [ 프로그래머스 | SQL Kit | Level 1 ] (0) | 2025.03.03 |