>데이터 베이스 >MySQL 튜토리얼 >계층적 데이터를 탐색하기 위해 SQL Server에서 재귀적 자체 조인을 수행하려면 어떻게 해야 합니까?

계층적 데이터를 탐색하기 위해 SQL Server에서 재귀적 자체 조인을 수행하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-17 15:41:09203검색

How Can I Perform Recursive Self-Joins in SQL Server to Traverse Hierarchical Data?

SQL Server 재귀적 자체 조인: 쉬운 방법

데이터베이스 관리에서 재귀적 셀프 조인은 테이블이 계층적 데이터를 순회할 수 있도록 여러 번 셀프 조인할 수 있는 기술입니다. SQL Server에서는 재귀 쿼리를 통해 이를 수행할 수 있습니다.

다음 시나리오를 고려해 보세요. 다음 열이 포함된 "Person"이라는 테이블이 있습니다.

<code>PersonID | Initials | ParentID</code>

이 테이블은 각 사람이 "이니셜" 열을 가지며 다른 사람을 참조하는 "ParentID"를 가질 수 있는 계층 구조를 나타냅니다.

"Person" 테이블에서 재귀적 셀프 조인을 수행하려면 아래와 같이 공통 테이블 표현식(CTE)을 사용할 수 있습니다.

<code class="language-sql">WITH q AS 
(
    SELECT  *
    FROM    Person
    WHERE   ParentID IS NULL 
    UNION ALL
    SELECT  m.*
    FROM    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q</code>

이 CTE에서는:

  1. 초기 쿼리는 "Person" 테이블에서 "ParentID"가 NULL이며 최종 조상을 나타내는 모든 행을 선택합니다.
  2. CTE의 재귀 부분은 "Person" 테이블에서 "ParentID"가 "q" CTE의 "PersonID"와 일치하는 행을 선택합니다. 이 단계는 계층 구조를 효과적으로 확장합니다.
  3. 마지막 쿼리는 "q" CTE의 모든 행을 선택하여 계층적 데이터를 제공합니다.

트리의 순서를 유지하기 위해 다음과 같이 재귀 쿼리에 정렬 조건을 추가할 수 있습니다.

<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    Person 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    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc</code>

ORDER BY 조건을 변경하여 계층 구조에서 형제 요소의 순서를 제어할 수 있습니다.

위 내용은 계층적 데이터를 탐색하기 위해 SQL Server에서 재귀적 자체 조인을 수행하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.