2012-06-20 4 views
1

두 테이블이 있습니다. 폴더, 파일. 각 테이블에는 부모 ID, ID, 이름, 유형CTE로 개체 트리 만들기

개의 필드가 있습니다. T-SQL을 사용하여 한 번에 전체 트리를 검색하려면 CTE를 만들어야합니다. 지금까지 내가 한 일이지만 재귀는 아직 활발하지 않습니다.

폴더 안에 하나 이상의 폴더/파일이있을 수 있음을 언급하는 것을 잊었습니다.

+0

어떻게 파일은 폴더에 관련이 있는가? 그리고 나무의 예상 출력 (형식)은 무엇입니까? – Lucero

+0

항상 ParentID를 사용합니다. 두 테이블 모두 Folder.ID 필드를 가리키는 ParentID 필드가 있습니다. – Raffaeu

답변

2

다음과 같은 일을해야 루트에서 ParentID 항목에 대한 NULL을 사용하고 있다고 가정 :

WITH FilesAndFolders AS (
    SELECT ID AS FileID, 
      CAST(NULL AS int) AS FolderID, 
      ParentID, 
      Name, 
      [Type] 
    FROM File 
    UNION ALL 
    SELECT CAST(NULL AS int), 
      ID, 
      ParentID, 
      Name, 
      [Type] 
    FROM Folder 
), 
Tree AS (
    SELECT FileID, 
      FolderID, 
      Name, 
      [Type], 
      CAST('' AS nvarchar(MAX)) AS [Path] 
    FROM FilesAndFolders 
    WHERE ParentID IS NULL 
    UNION ALL 
    SELECT FF.FileID, 
      FF.FolderID, 
      FF.Name, 
      FF.[Type], 
      T.[Path]+T.[Name]+'/' 
    FROM FilesAndFolders FF 
    JOIN Tree T ON T.FolderID = FF.ParentID 
) 
SELECT FileID, FolderID, [Path]+[Name] FullName, [Type] 
FROM Tree 
+0

작동합니다. 고맙습니다. 아마도 첫 번째 select all을 제거하고 첫 번째 CTE 내에서 parentID를 전달하여 더 빠르게 만들 것입니다. – Raffaeu

+0

@Raffaeu, 다행입니다. 그러나 주어진 데이터 구조 (예 : 하나가 아닌 두 개의 다른 테이블에있는 파일 및 폴더)를 사용하여 "첫 번째 선택을 제거하십시오"라는 의미를 이해하지 못합니다. 어떻게 처리 속도를 향상 시킬지 잘 모르겠습니다. 배후에서 "재귀 적"CTE는 실제로 재귀가 아니지만 조인에 사용되어 더 많은 행을 추가하는 데 사용할 수있는 생성 된 행에 커서가 있습니다. Btw : 당신이 일했던 나라의 인사 ...;) – Lucero

+0

니스, 그것을 즐겨라! – Raffaeu