KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.
이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.
프로그래머스에서 SQL 문제 풀기
문제
- 부모 개체와 자식 개체의 관계를 세대로 표현하여 3세대인 대장균 ID 조회하는 쿼리 작성
- 각 대장균 ID 기준 오름차순 정렬
✔️ 제출 쿼리
✔️ 쿼리 분석
WITH RECURSIVE Generation AS (
# 첫 번째 세대 선택: PARENT_ID가 NULL인 개체를 찾음
SELECT ID
, PARENT_ID
, 1 AS Gen
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
# 재귀적으로 다음 세대 찾기: 이전 세대의 ID를 부모 ID로 가지는 개체를 찾음
SELECT E.ID
, E.PARENT_ID
, G.Gen + 1 AS Gen
FROM ECOLI_DATA E
INNER JOIN Generation G ON E.PARENT_ID = G.ID
)
# 3세대 개체의 ID 선택
SELECT ID
FROM Generation
WHERE Gen = 3
ORDER BY ID
첫 번째 세대 선택
SELECT ID , PARENT_ID , 1 AS Gen FROM ECOLI_DATA WHERE PARENT_ID IS NULL
- PARENT_ID가 NULL인 개체들을 선택하여 첫 번째 세대로 설정
- Gen 컬럼을 1로 설정하여 첫 번째 세대를 표시
재귀적으로 다음 세대 찾기
- UNION ALL을 사용하여 첫 번째 세대의 자식 개체들을 재귀적으로 찾고,
INNER JOIN Generation G ON E.PARENT_ID = G.ID
를 사용하여
현재 세대의 ID를 부모 ID로 가지는 개체들을 찾기SELECT E.ID , E.PARENT_ID , G.Gen + 1 AS Gen FROM ECOLI_DATA E INNER JOIN Generation G ON E.PARENT_ID = G.ID
- 부모 ID가 이전 세대의 ID인 개체들을 찾아 세대를 하나씩 증가시키기
최종 결과 선택
- 3세대 개체의 ID 선택
SELECT ID FROM Generation WHERE Gen = 3 ORDER BY ID
- Gen 값이 3인 개체들을 선택하여 3세대 개체들 식별
- 결과를 ID 오름차순으로 정렬하여 출력
+)
재귀 쿼리에 대한 설명
- WITH RECURSIVE 절
- SQL에서 재귀적으로 데이터를 처리하기 위해
WITH RECURSIVE 절을 사용한다.
- CTE의 한 형태로, 자기 자신을 참조하여
반복적인 처리를 수행할 수 있게 한다.
- 초기 조건
- 첫 번째 세대와 같이 재귀 처리를 시작하는 초기 조건을 정의.
이번 쿼리에서는 PARENT_ID가 NULL인 개체들을 첫 번째 세대로 선택
- 재귀 부분
- UNION ALL을 사용하여 초기 조건에서 시작하여
다음 세대를 찾는 재귀적 구조를 맞춘다.
- INNER JOIN을 통해 부모 ID가
이전 세대의 ID인 개체들을 찾아 세대 증가시키기.
- 종료 조건
- 재귀 쿼리는 암묵적으로 종료 조건을 가진다.
이 쿼리에서는 더 이상 매칭되는 개체가 없을 때 재귀 종료
- 결과 선택
- 마지막으로 원하는 세대의 데이터를 선택하여 조회
이 쿼리에서는 3세대 개체들의 ID를 선택하고 정렬