SQL을 사용하여 관계형 데이터베이스에서 트리와 유사한 데이터 탐색


16

SQL에서 트리 데이터를 순회하는 방법이 있습니까? connect byOracle에서는 알고 있지만 다른 SQL 구현에서 이것을 수행하는 다른 방법이 있습니까? connect by각 결과에 대해 쿼리를 실행하기 위해 루프 또는 재귀 함수를 작성하는 것보다 사용 이 더 쉽기 때문에 묻습니다 .

어떤 사람들은 "트리 데이터"라는 문구에 혼란스러워 보이기 때문에 다음과 같이 더 설명 할 것 parent_id입니다. 즉, 같은 테이블에있는 다른 행의 기본 키를 포함하는 비슷한 필드 가있는 테이블과 관련이 있습니다 .

질문은 Oracle 데이터베이스에 이러한 방식으로 저장된 데이터로 작업하고 connect by다른 DBMS에서는 구현되지 않았다는 경험에서 비롯된 것 입니다. 표준 SQL을 사용한다면 올라가고 자하는 각 부모마다 새로운 테이블 별칭을 만들어야합니다. 이것은 쉽게 벗어날 수 있습니다.


Joe Celko의 솔루션이 있습니다. 몇 가지 샘플 : SQL트리, Oracle의 트리 및 계층 구조 , 중첩 세트 모델 . 구문 설탕을 가질 필요는 없습니다 ;-).
Marian

답변:


14

Celko의 책 은 좋은 자료입니다.

나는 또한 '클로저 테이블'로 알려진 이 방법이 상당히 잘 작동한다는 것을 실제로 발견 했습니다 .

재귀 CTE (예 : PostgreSQL 8.4 이상 또는 SQL Server 2005 이상 ) 를 허용하는 데이터베이스를 사용하는 경우 실제로 가장 좋은 방법입니다. Oracle을 사용하는 경우 항상 "연결 방법"이 있습니다.

"순진한 트리"스키마에서 테이블 세트를 전달하고 클리너를 작성할 기회보다 스토리지에서 올바른 트리를 추출하는 방법을 알아내는 것이 훨씬 흔합니다. "클로저 테이블"구조.


9

재귀 CTE가 가장 쉬운 솔루션이 될 것입니다. SQL Server 2005 및 현재 버전의 PostgreSQL은 CTE를 지원합니다. SQL Server 2008 이상을 사용하는 경우 HIERARCHYID데이터 유형을 사용할 수 있습니다 . 이에 대한 좋은 예는 HierarchyID : SQL Server 2008을 사용하여 데이터 계층 모델링

추가 자료 :



1

표준 SQL 방법은 "재귀 쿼리"이며, 이는 재귀 CTE WITH [ RECURSIVE ]에서 제공하며 쿼리에서 와 같이 지정됩니다 . 구현은 사양에 지정되어 있지 않고 재귀적인 구조를 쿼리하는 데 사용할 수있는 메서드 만 제공합니다. 가장 간단한 경우 데이터 구조의 구현에는 행에 ID 및 상위 ID 만 필요합니다.

예를 들어 PostgreSQL은 재귀 CTE를 지원하지만 ltree구현시 다른 장단점을 제공하는 RDBMS 관련 솔루션도 많이 있습니다.

태그를 통해 검색하여이 사이트에 대한 자세한 정보를 찾을 수 있습니다 .

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