SQL Server에서 재귀적 자체 조인을 사용하여 계층적 데이터를 효율적으로 검색
SQL Server의 재귀적 자체 조인은 단일 테이블 내의 계층적 데이터 구조를 탐색하는 효과적인 방법을 제공합니다. 이 기술에는 테이블의 행을 탐색하여 계층 관계를 기반으로 관련 데이터를 수집하는 작업이 포함됩니다. 다음 쿼리는 간소화된 접근 방식을 보여줍니다.
<code class="language-sql">WITH q AS ( SELECT * FROM mytable WHERE ParentID IS NULL UNION ALL SELECT m.* FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q;</code>
이 쿼리는 'q'라는 재귀 공통 테이블 표현식(CTE)을 활용합니다. CTE는 계층 구조의 최상위 노드를 나타내는 ParentID
가 NULL
인 모든 행을 선택하는 것으로 시작합니다. 그런 다음 mytable
및 ParentID
열을 기반으로 하위 행을 추가하여 PersonID
을 CTE 자체와 재귀적으로 조인합니다. 이 반복 프로세스는 모든 하위 항목이 포함될 때까지 계속됩니다.
이 샘플을 고려해보세요 mytable
:
PersonID | Initials | ParentID |
---|---|---|
1 | CJ | NULL |
2 | EB | 1 |
3 | MB | 1 |
4 | SW | 2 |
5 | YT | NULL |
6 | IS | 5 |
CJ의 계층 구조(여기서 PersonID
= 1)를 검색하면 다음이 생성됩니다.
PersonID | Initials | ParentID |
---|---|---|
1 | CJ | NULL |
2 | EB | 1 |
3 | MB | 1 |
4 | SW | 2 |
마찬가지로 EB의 계층 구조(PersonID
= 2)는 다음을 반환합니다.
PersonID | Initials | ParentID |
---|---|---|
2 | EB | 1 |
4 | SW | 2 |
계층적 순서를 유지하려면 순서 조건을 통합하는 수정된 쿼리가 유용합니다.
<code class="language-sql">WITH q AS ( SELECT m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc FROM mytable m WHERE ParentID IS NULL UNION ALL SELECT m.*, q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q ORDER BY bc;</code>
이 향상된 쿼리는 각 노드에서 루트까지의 경로를 나타내는 bc
열을 CTE에 도입합니다. bc
으로 결과를 정렬하면 형제 순서를 포함한 계층 구조가 유지됩니다. ORDER BY
절은 필요에 따라 형제 순서를 조정하도록 사용자 정의할 수 있습니다.
위 내용은 재귀적 자체 조인은 어떻게 SQL Server에서 계층적 데이터를 효율적으로 검색할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!