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

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

Linda Hamilton
풀어 주다: 2025-01-17 15:37:08
원래의
422명이 탐색했습니다.

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

계층적 데이터를 위한 SQL Server의 재귀적 자체 조인 마스터하기

재귀적 자체 조인은 SQL Server 테이블 내의 계층적 데이터 구조를 탐색하는 데 필수적입니다. 이 기술은 조직도나 가계도와 같이 부모-자식 관계로 정리된 데이터를 처리할 때 특히 유용합니다.

재귀적 자체 조인에 대한 간단한 접근 방식은 공통 테이블 표현식(CTE)을 사용합니다.

<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>
로그인 후 복사

이 쿼리는 재귀 CTE q를 정의합니다. 초기 SELECT 문은 루트 노드(ParentID가 NULL인 노드)를 식별합니다. UNION ALL는 이를 SELECT과 CTE를 재귀적으로 결합하여 모든 하위 항목을 포함하는 후속 mytable 문과 결합합니다. 마지막 SELECT 문은 전체 계층적 데이터세트를 검색합니다.

계층적 질서 유지

원래 계층 구조와 순서를 유지하려면 수정된 쿼리가 필요합니다.

<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을 사용하여 ROW_NUMBER() 열을 추가하여 고유 식별자를 할당하고 계층 구조의 각 수준 내에서 순서를 유지합니다. ORDER BY bc 절은 최종 결과가 원래 트리 구조를 반영하도록 보장합니다. ORDER BY 함수 내에서 ROW_NUMBER() 절을 조정하면 형제 노드 순서를 사용자 정의할 수 있습니다.

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

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