2012-06-07 8 views
0

읽을 수있는 형식으로 표시하고자하는 부모 - 자식 관계가있는 SQL 테이블이 제공되었습니다.다른 레코드의 SQL - 부모 - 자식 관계

주요 열은 서랍, 폴더, 문서입니다. 각 서랍에는 여러 폴더가 연결될 수 있으며 각 폴더에는 여러 문서가 연결될 수 있습니다. 그러나 폴더와 문서는 같은 레코드에 나열되지 않습니다.

이 테이블에는 항목 형식이 들어 있으며 폴더와 문서는 모두 항목으로 간주됩니다. 테이블을 연관 시키려면 테이블의 항목 번호를 문서 레코드의 parentID에 지정합니다. 예를 들어

:

Drawer 1 
    Folder 1 
     Document A 
     Document B 
     Document C 
    Folder 2 
     Document A 
    Folder 3 
     Document A 
     Document B  

에 ParentID을 묶는 방법입니다에 내가 붙어있어 부분 :

DrawerID ItemID ParentID Type Name 
    1   1   0  Folder Folder 1 
    1   2   0  Folder Folder 2 
    1   3   0  Folder Folder 3 
    1   4   0  Folder Folder 4 
    1   5   1  Document Document A 
    1   6   1  Document Document B 
    1   7   1  Document Document C 
    1   8   2  Document Document A 
    1   9   3  Document Document A 
    1   10   3  Document Document B 

내가 찾고과 유사한 출력입니다 ItemID. 최선의 접근 방식은 일종의 노동 조합일까요? 새 테이블에 재귀 프로그래밍? 나는 SQL 사람이 아니에요 - 난 그냥 잘라 당신은 단지 두 가지 수준의 깊은려고하는 경우에 쿼리를 붙여 넣기 비트가 너무 작은 단어 :

+1

witch RDBMS을 사용하십니까? –

+0

이 테이블은 당신이 붙어있는 테이블입니까, 아니면 엔터티로 분할 할 수 있습니까? 그렇지 않으면 많은 자체 조인이 될 것입니다. – Turnkey

+0

SQL 2008 및 나는 그대로 테이블에 붙어 있습니다. – user1442906

답변

0

이 쿼리는 작동해야하며 데이터에서 SQL Server에서 OK를 테스트해야합니다. 기본적으로이 폴더를 나타내는 쿼리에 두 개의 가상 테이블을 만드는 것 및 문서 엔티티는 다음 부모 관계에 함께 참여 : 당신이 사용할 수있는

SELECT Folder.DrawerID, Folder.FolderId, Folder.FolderName, Doc.DocumentId, Doc.DocumentName 
    FROM 

    (Select DrawerId, ItemId AS FolderId, ParentId, [Name] AS FolderName FROM Drawers WHERE [Type] ='Folder') Folder, 

    (Select DrawerId, ItemId AS DocumentId, ParentId, [Name] AS DocumentName FROM Drawers WHERE [Type] ='Document') Doc 

    WHERE Doc.ParentId = Folder.FolderId 
    ORDER BY DrawerId, FolderName, DocumentName 
+0

Perfect! 도와 주셔서 감사합니다! – user1442906

+0

도움이 되니 기쁩니다! – Turnkey

0

를 사용하십시오, 그것은 의미는 다음과 같이 데이터를 만들 수 있습니다

DrawerID FolderID ItemId Description ... 

폴더 자체의 항목 ID는 null이거나 0입니다.

SELECT * FROM table ORDER BY DrawerID, FolderID, ItemID 
+0

아, 테이블을 다시 할 수 있으면 좋겠지 만 구조에 대한 통제를 벗어났습니다. – user1442906

0

표준 SQL에는 재귀가 없습니다 :와

그런 다음 쿼리 수 있습니다.

그러나 문제의 종류를 해결하는 패턴이 있습니다. 그 중 하나는 nested sets입니다.

+1

CTE가있는 T-SQL과 같은 특정 SQL 특성을 추가하려는 경우 재귀를 지원해야합니다. – mfussenegger

+0

@mfussenegger 동의 함. 나는 더 진실하게 만들기 위해 첫 문장을 바꿨다. – wroniasty

0

자체 조인 당신이 다루고있는 얼마나 많은 수준 알고있는 경우. 자체 조인에서는 기본적으로 같은 테이블이 새로운 테이블이며 다른 이름을 가진 별칭 (T2 등)을 가장한다고 가정합니다. 이 예는 사용자가 시작할 수 있습니다.

데이터에 이상한 문제가 있으며, 완료 할 개념에 대해 서랍 ID = 0 유형의 행이 있어야합니다. 아래 코드를 변경하거나 오류를 수정해야합니다.

select 

T1.name, 
T2.name, 
T3.name //etc repeat as needed and below 

from myTable T1 

LEFT OUTER JOIN myTable T2 ON 
    T2.ParentID= T1.ItemID 

LEFT OUTER JOIN myTable T2 ON 
    T2.ParentID= T3.ItemID 

group by 1,2,3 
+0

정확합니다. ItemID가 0이고 ParentID가 NULL 인 서랍 행이 있습니다. 한 가지 확실한 것은 코딩 된 코드를 읽는 것입니다. T3은 어디에 정의되어 있습니까? – user1442906