2012-08-23 3 views
2

가능한 중복 :
How to store directory/hierarchy/tree structure in the database?SQL 쿼리를 만들어 트리를 만드는 방법은 무엇입니까?

나는이 쿼리를 사용

SELECT Id, Name, ParentId 
FROM Table_1 

을 그리고 나는 모든 요소를 ​​사용하여 트리를 구축 할 수 있습니다.

하지만 명확한 Id에서 시작하는 트리를 구축하려는, 그래서에만이 Id이처럼이 Id 의 모든 차일을 반환하는 쿼리를 만들 필요가 있다면 무엇을 :

SELECT Id, Name, ParentId 
FROM Table_1 
WHERE (Id = randomNumber) OR (all possible childs of Id = randomNumber) 

도와주세요 질의를하십시오.

는 편집 :

이것은 당신이 당신이 자식 ID로 부모 ID를 연결 자체에 테이블을 가입 할 수 있습니다 MS-액세스

+0

부모 자녀와 자녀 등의 자녀를 갖기를 원하십니까? – devundef

+0

당신의 나무는 얼마나 깊습니까? –

+0

@devundef, 맞아! – Steven

답변

0

관련 게시물에서 언급했듯이 SQL을 단독으로 사용할 수는 없지만 비교적 쉽게 SQL과 VBA의 조합을 사용하여 수행 할 수 있습니다.

목표는 지정된 Id이 해당 레코드와 모든 하위 레코드를 반환하도록하는 것입니다. 결과적으로 행 Id이 지정된 조상의 직계 종속이면 true를 반환하는 부울 함수 만 있으면됩니다.

당신의 SQL은 다음과 같습니다 나는 DLookup을 사용했기 때문에

Public Function IsDescendant(id As Integer, relative As Integer) As Boolean 
    Dim currentID As Variant 
    currentID = id 

    Do Until IsNull(currentID) 
     If (currentID = relative) Then 
      IsDescendant = True 
      Exit Function 
     End If 
     currentID = DLookup("ParentId", "Table_1", "Id=" & currentID) 
    Loop 
    IsDescendant = False 
End Function 

성능 현명한이 가장 큰되지 않을 수도 있지만, 우리는 또한 RecordSet을 사용할 수

SELECT Id, Name, ParentId 
FROM Table_1 
WHERE IsDescendant(Id, randomNumber); 

Access에서 VBA 기능이 될 것이다 상당한 성능 향상이있을 경우 개체. 이것은 내가 적어 둘 수있는 가장 빠른 코드 일뿐입니다.

0

필요

SELECT Id, Name, ParentId 
FROM table_1 
Connect by prior Id = ParentId 
Start with Id = randomNumber 

오라클

에서 그것을 만들 수있는 방법이다

SELECT T1.Id, T1.Name, T2.Id, T2.Name 
FROM Table_1 as T1 
JOIN Table_1 as T2 on T1.Id = T2.ParentId 

을 감안할 때 데이터

Id, Name  ParentId 
1, Top,  null 
2, ChildOne, 1 
3, ChildTwo, 1 
4, ChildThree, 1 

이 당신에게 당신은 거의가

1, Top, 2, ChildOne 
1, Top, 3, ChildTwo 
1, Top, 4, ChildFour 
+0

그리고 여러 의존성이 있다면 두 가지가 아니라 세 가지 수준입니까? 주어진 이드의 아이를 가질 수는 없습니다. –

+0

당신이 재귀 적으로 원한다면, 저장된 프로 시저를 재귀 적으로리스트하는 것을 볼 수있을 것입니다. –

0

같은 결과를 줄 것이다,이

SELECT Id, Name, ParentId 
FROM Table_1 
WHERE (Id = randomNumber) OR (ParentId = randomNumber) 
+0

나무의 한 수준 만 만들지 않겠습니까? – DFord

+0

이렇게하면이 루트의 루트 및 하위 만 다시 실행되지만 하위의 하위는 어디에 있습니까? – Steven

+0

danm, 당신 말이 맞아요. andras의 대답을 시도해보십시오. – Stuart

1

이 하나를 시도 트릭을 할해야한다, 나는 이것이 당신이 찾고있는 희망 :

DECLARE @ID int 

SET @ID = 1; 

WITH CTE_Table_1 
(
ID, 
Name, 
ParentID, 
TreeLevel 
) 
AS(
    SELECT 
    ID, 
    Name, 
    ParentID, 
    0 AS TreeLevel 
    FROM Table_1 
    WHERE ID = @ID 

    UNION ALL 

    SELECT 
    T.ID, 
    T.Name, 
    T.ParentID, 
    TreeLevel + 1 
    FROM Table_1 T 
    INNER JOIN CTE_Table_1 ON CTE_Table_1.ID = T.ParentID 
) 

SELECT * FROM CTE_Table_1 
관련 문제