> 데이터 베이스 > MySQL 튜토리얼 > 재귀적 자체 조인은 어떻게 SQL Server에서 계층적 데이터를 효율적으로 검색할 수 있습니까?

재귀적 자체 조인은 어떻게 SQL Server에서 계층적 데이터를 효율적으로 검색할 수 있습니까?

Linda Hamilton
풀어 주다: 2025-01-17 15:47:14
원래의
193명이 탐색했습니다.

How Can Recursive Self-Joins Efficiently Retrieve Hierarchical Data in SQL Server?

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는 계층 구조의 최상위 노드를 나타내는 ParentIDNULL인 모든 행을 선택하는 것으로 시작합니다. 그런 다음 mytableParentID 열을 기반으로 하위 행을 추가하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿