Dev JS Blog

[MySQL] MySQL WITH 재귀쿼리 계층구조 본문

옛날 창고/SQL

[MySQL] MySQL WITH 재귀쿼리 계층구조

Dev JS 2020. 12. 30. 19:07
728x90

[MySQL] MySQL WITH 재귀쿼리 계층구조

 

 

보통 WITH 문 재귀쿼리 를 이용해서 계층 구조를 나타내는데 사용한다.

 

일단 재귀쿼리란..?

 

재귀 - 원래의 자리로 되돌아가거나 되돌아옴

 

이란 뜻을 갖고 있다. 

 

쉽게 생각하면 같은걸 반복한다고 생각하면 쉬울까..

 

즉 재귀쿼리는 한 쿼리가 반복되어 실행된다고 생각하면 된다.

이러한 반복 쿼리는 계층구조를 SELECT 할때 유용하게 쓰인다.

 

기본적으로 코드 테이블 구조를 만들때

code 와 parent_code(부모코드) 컬럼으로 구성하게 되면

계층구조로 select 하기 편해진다.

 

WITH 문을 이용한 계층쿼리 부터 확인해보자

 

CODE_TABLE

code

 parent_code

 a

 b

 A

AA 

 B

AA 

 AA

 

 

 

테이블 데이터가 이렇게 구성되어있다고 생각해보자

 

a,b의 부모는 A

A,B의 부모는 AA

부모가 없는 최상위 AA

인 구조이다.

 

이걸 기본적인 재귀쿼리로 나타낸다면

 

WITH CTE AS (
    SELECT 

code,

parent_code

FROM CODE_TABLE 

WHERE code = 'AA'

UNION ALL

SELECT

a.code,

a.parent_code

FROM CODE_TABLE a

INNER JOIN CTE b ON a.parent_code = b.code 

 

)

SELECT code, parent_code FROM CTE

 

이런식으로 나타낼수 있다.

꼭 CTE로 쓸 필요는 없지만.. 보통 이렇게 쓴다.

 

내가 처음 재귀쿼를 보왔을때는

CTE가 정의되기도 전에 AS 안에 쓰는게 참 이상했다.

 

CTE를 안에 씀으로서 계속 재귀하게 된다.

 

INNER JOIN CTE b ON a.parent_code = b.code  이부분에서

 

'AA'를 부모로 갖는 것 'A','B' 

또 재귀하여

'A' 또는 'B'를 부모로 갖는것 'a','b' 

 

까지 모두 SELECT가 된다.

 

처음에 헷갈릴수있겠지만 쉬운 쿼리로 천천히 생각해보길 바란다.

 

 

그리고 이러한 재귀쿼리를 MYSQL 에서 사용하면

오류가 발생한다.

Table 'CTE' doesn't exist

 

CTE 테이블이 존재 하지 않는다는 오류가 발생하는데 여기서

 

WITH RECURSIVE CTE AS (
    SELECT 

code,

parent_code

FROM CODE_TABLE 

WHERE code = 'AA'

UNION ALL

SELECT

a.code,

a.parent_code

FROM CODE_TABLE a

INNER JOIN CTE b ON a.parent_code = b.code 

 

)

SELECT code, parent_code FROM CTE;

 

RECURSIVE 한단어만 추가해준다면 재귀쿼리가 가능하다.

 

 

 

 

 

 

 

 

728x90

'옛날 창고 > SQL' 카테고리의 다른 글

ROW NUMBER 사용하여 로우 넘버 부여하기  (0) 2020.12.30
[MySQL] MySQL data convert  (0) 2020.12.30
[MySQL] Mysql Merge into  (0) 2020.12.30
[MySQL] Mysql 날짜 포맷  (0) 2020.12.30
[Mysql] 데이터 한 로우로 그룹핑  (0) 2020.12.25
Comments