재귀 쿼리로 트리 구조의 데이터 검색
소개
폴더 기능을 만들 때 SQLserver에서 재귀 쿼리를 작성했으므로 메모로 남겨두고 싶습니다.
재귀 함수
함수 내에서 자신을 호출하는 것을 재귀 함수라고합니다.
쓸데없이 많이 사용하면 코드가 보기 어려워집니다만, 무엇중이 될지 모르는 때 등 루프로 하기 어려운 경우에 재귀 함수를 사용하면 간단하게 쓸 수도 있습니다.
function funcA(n){
if(n == 0){
return 0;
}else{
return n + funcA(n-1);
}
}
나무 구조 데이터
아래와 같은 구조의 데이터를 트리 구조라고 합니다.
이하와 같이 각 노드가 부모의 노드를 가지는 것만의 데이터 구조를 인접 리스트 모델이라고 합니다.
parentid
id
0
1
1
2
1
3
2
4
2
5
그 외에는 경로 열거 모델, 중첩 모델, 폐쇄 테이블 모델 등이 있습니다.
인접 리스트 모델은 간단하지만, RDBMS가 재귀 쿼리에 대응하지 않는 경우는 자손 노드를 취득하기 어려운 등의 문제가 있어, 안티 패턴이 됩니다.
SQLserver는 재귀 쿼리를 지원하므로 괜찮습니다.
WITH 절을 사용하여 재귀 쿼리 작성
1.id:2보다 위의 계층의 정보를 취득하는 경우
→ 취득할 수 있는 id 1, 2
WITH r AS (
--起点となるselect文
SELECT
*
FROM
tbl1
WHERE
tbl1.id = 2
UNION ALL
--再帰
SELECT
*
FROM
tbl2 AS r
WHERE
tbl2.id = r.parentid
)
SELECT
*
FROM
r
2.id:2보다 아래의 계층의 정보를 취득하는 경우
→ 취득할 수 있는 id 2, 4, 5
WITH r AS (
--起点となるselect文
SELECT
*
FROM
tbl1
WHERE
tbl1.id = 2
UNION ALL
--再帰
SELECT
*
FROM
tbl2 AS r
WHERE
--ここのidとparentidが逆になる
tbl2.parentid = r.id
)
SELECT
*
FROM
r
결론
SQL 안티 패턴이라고 하는 책이 있어, 그 중의 2장 Naive Trees(소박한 나무)를 정리하고 있다 여기 의 기사가 설계시에 참고가 되었습니다.
자신도 읽고 싶습니다.
Reference
이 문제에 관하여(재귀 쿼리로 트리 구조의 데이터 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nakamiku/items/c4180c6de88c033d1134텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)