HierarchyId를 사용하여 트리 분기를로드 / 읽는 세트 기반 방법이 있습니까?


11

HierarchyId로 놀고 있는데 다음을 수행하는 일련의 방법을 찾지 못했습니다.

  • 모든 서브 트리를 한 번에 삽입
  • 한 번에 모든 하위 트리를 검색

이 질문은 이전 질문과 관련이 있으며 HierarchyId 로이 두 가지 작업을 수행하는 유일한 방법은 한 번에 하나의 노드 또는 하나의 수준이라고 생각합니다. 구체화 된 경로를 사용하는 경우 단일 (및 사소한) 세트 기반 명령으로 두 작업을 쉽게 수행 할 수 있습니다.

내가 무엇을 놓치고 있습니까?

편집 : 하위 트리를 이동하는 방법도 놓쳤지만 Mikael Eriksson의 의견에서 그것을 배웠습니다.


2
당신은 이것을 본 적 있습니까? 움직이는 서브 트리
Mikael Eriksson

@MikaelEriksson 당신은 당신의 코멘트를 대답으로 만들 수 있습니까?
AK

2
확실한. 나는 또한 무슨 일이 일어나고 있는지 이해하는 방법에 대해 자세히 설명했다. BTW, HierarchyId에서 약간만 테스트했지만 프로덕션에서는 사용하지 않았습니다.
Mikael Eriksson

답변:


5

사용할 함수는 GetReparentedValue 이지만 GetReparentedValue트리 만 사용 하는 경우 "일관되지 않은"상태가 될 수 있습니다.

다음은 Microsoft에서 제공하는 코드입니다. 하위 트리 이동 .

나는 이것과 관련된 나무를 강제하는 것 같아요 . PK에 자체 조인을 수행하는 부모 ID에 대해 계산 된 열을 사용합니다.


이것이 지금까지 가장 좋은 대답입니다. 불행히도 하나의 명령에 여러 수준의 하위 트리를 삽입 / 선택하는 방법이 없습니다.
AK

3

전체 하위 트리 검색은 간단합니다. MSDN에 따라 IsDescendentOf방법을 사용하십시오.

DECLARE @Manager hierarchyid
SELECT @Manager = OrgNode FROM HumanResources.EmployeeDemo
  WHERE LoginID = 'adventure-works\dylan0'

SELECT * FROM HumanResources.EmployeeDemo
WHERE OrgNode.IsDescendantOf(@Manager) = 1

삽입은 더 복잡하지만 주된 문제는 제약 사항과 관련이 있습니다. 부모가 커밋 될 때까지 자식 개체를 삽입 할 수 없습니다. 이 경우 계층 순서로 반복하여 삽입하거나 구속 조건을 끄고 삽입하십시오.

마이그레이션, 배치 또는 대량 삽입 등 대량의 데이터를 삽입 할 때 제약 조건을 해제합니다. 운영 체제로 삽입 할 때 시스템 실행 중에 인스턴스가 발생하지 않았으므로 대량으로 삽입 해야하는 반복 작업을 반복했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.