Recursive


[ Recursive ]

오늘은 드라이브 폴더 구조를 가져오는 코드를 작성하는 과정에서 재귀쿼리에 대해서

알게 됐다. 오늘 사용해본 바, 재귀쿼리를 사용할 만한 경우는 3가지로 생각된다.

⒈ 카테고리, 태그

⒉ 회사 부서 검색

⒊ 폴더 경로 검색



[ 소스 코드 ]


WITH RECURSIVE t3 (DATA_SEQ, PARENTS, FOLDER_NAME) AS
	(
		#############  번째 쿼리 ################
		SELECT 
			t1.DATA_SEQ, 
			t1.PARENTS, 
			f1.FOLDER_NAME
		FROM DRIVE_DATA t1
		LEFT JOIN FOLDER f1 
			ON t1.DATA_SEQ = f1.DATA_SEQ 
		WHERE t1.DATA_SEQ = '180'
			AND t1.DATA_TYPE = '0'
		###########################################
	
		UNION ALL

		#############  번째 쿼리 ################
		SELECT 
			t2.DATA_SEQ, 
			t2.PARENTS, 
			f2.FOLDER_NAME 
		FROM DRIVE_DATA t2
		JOIN t3      # JOIN주의!!!
			ON t2.DATA_SEQ = t3.PARENTS
		LEFT JOIN FOLDER f2 
			ON t2.DATA_SEQ = f2.DATA_SEQ
	    ##########################################
	)
SELECT * FROM t3
SELECT t3.DATA_SEQ, t3.FOLDER_NAME FROM t3;



First Query Result

최초 행 반환 (non-recursive)

단순히 쿼리의 결과를 반환한다. 반복해서 호출되지는 않는다.



Second Query Result

추가 행 반환 (recursive)

첫 번째 쿼리의 결과와 UNION ALL뒤에 나오는 쿼리의 모든 결과가 하나로 합해진다.



UNION ALL

각 쿼리의 모든 결과를 포함한 합집합(중복제거 안함)

추가적으로 UNION이라는 것도 있는데, 각 쿼리의 결과합을 반환하는 점에서는

동일하지만, 중복제거를 하지 않는다는 차이점이 있다.