2010-04-06 6 views
0

parentID를 통해 자체적으로 연결되는 SQL 테이블이 있습니다. 나는 아이들과 그 아이들을 찾아 내고 모든 아이들의 물건을 찾을 때까지 기다리고있다. 이 작업을 수행하는 재귀 함수가 있지만 매우 효과적이지는 않습니다.모든 하위 단위를보다 효율적으로 가져 오는 방법

sql이 모든 하위 객체를 찾을 수있는 방법이 있습니까? 그렇다면 어떻게? Microsoft SQL Server 관리 스튜디오 익스프레스 9.00.2047.00

+0

이러한 쿼리는 일반적으로 'INNER JOIN'및 'LEFT JOIN'이 포함 된 손 (또는 쿼리 디자이너)으로 작성됩니다. –

+0

나는 모든 자식 개체를 찾을 때까지 아이들과 아이들을 찾고 싶습니다. – Hazior

+2

어떤 데이터베이스가 있습니까? 버전을 포함하십시오. –

답변

2

Sql Server 2005 CTEs을 사용해보십시오.

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(10), 
     ParentID INT 
) 

INSERT INTO @Table SELECT 1, 'A', NULL 
INSERT INTO @Table SELECT 2, 'B', NULL 
INSERT INTO @Table SELECT 3, 'C', 1 
INSERT INTO @Table SELECT 4, 'D', 1 
INSERT INTO @Table SELECT 5, 'E', 4 
INSERT INTO @Table SELECT 5, 'F', 2 

;WITh Parents AS (
    SELECT *, 
      CAST(Val + '/' AS VARCHAR(100))PathVal 
    FROm @Table 
    WHERE ParentID IS NULL 
    UNION ALL 
    SELECT t.*, 
      CAST(p.PathVal + t.Val + '/' AS VARCHAR(100)) 
    FROM @Table t INNER JOIN 
      Parents p ON t.ParentID = p.ID 
) 
SELECT * 
FROM Parents 

트리의 깊이에 따라 내가 Nested Set Model 같은 것을 제안

MAXRECURSION 쿼리 힌트

+0

코드가 이깁니다. +1 : –

+0

감사합니다. 도움이되었습니다. 이제 재귀 SQL 감사를 이해합니다. – Hazior

0

당신은 CTEs를 찾고 있습니다 :

사용

.
Using Common Table Expressions, MSDN.
적어도 SQL Server 2005가 필요합니다.

+0

나는 모든 자식 객체를 찾을 때까지 자식과 그 자식을 찾고 싶습니다. – Hazior

+0

andras가 말했듯이 재귀 적 쿼리와 CTE를 사용하여이 작업을 수행 할 수 있습니다. (http://msdn.microsoft.com/en-us/library/ms186243.aspx) – Todd

0

에서 살펴 봐야 할 수 있습니다.

아이디어는 링크를 따라 더 자세히 읽을 수있는 시스템에 따라 계산 된 각 노드에 대해 추가로 두 개의 정수 (일반적으로 "왼쪽"및 "오른쪽"이라고 함)를 저장하는 것입니다. 그런 다음 임의의 노드의 모든 자손에 대한 쿼리가 간단 해집니다.

편집 :Here 자세한 설명입니다.

+0

아, 테이블에 대한 스키마를 변경할 수 없다는 것을 깨달았습니다. 그렇다면이 대답은 쓸모가 없습니다. 그러나 가능한 경우, 이것은 흥미로운 옵션입니다. – Jakob

관련 문제