두 테이블이 있습니다. 폴더, 파일. 각 테이블에는 부모 ID, ID, 이름, 유형CTE로 개체 트리 만들기
개의 필드가 있습니다. T-SQL을 사용하여 한 번에 전체 트리를 검색하려면 CTE를 만들어야합니다. 지금까지 내가 한 일이지만 재귀는 아직 활발하지 않습니다.
폴더 안에 하나 이상의 폴더/파일이있을 수 있음을 언급하는 것을 잊었습니다.
두 테이블이 있습니다. 폴더, 파일. 각 테이블에는 부모 ID, ID, 이름, 유형CTE로 개체 트리 만들기
개의 필드가 있습니다. T-SQL을 사용하여 한 번에 전체 트리를 검색하려면 CTE를 만들어야합니다. 지금까지 내가 한 일이지만 재귀는 아직 활발하지 않습니다.
폴더 안에 하나 이상의 폴더/파일이있을 수 있음을 언급하는 것을 잊었습니다.
다음과 같은 일을해야 루트에서 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
작동합니다. 고맙습니다. 아마도 첫 번째 select all을 제거하고 첫 번째 CTE 내에서 parentID를 전달하여 더 빠르게 만들 것입니다. – Raffaeu
@Raffaeu, 다행입니다. 그러나 주어진 데이터 구조 (예 : 하나가 아닌 두 개의 다른 테이블에있는 파일 및 폴더)를 사용하여 "첫 번째 선택을 제거하십시오"라는 의미를 이해하지 못합니다. 어떻게 처리 속도를 향상 시킬지 잘 모르겠습니다. 배후에서 "재귀 적"CTE는 실제로 재귀가 아니지만 조인에 사용되어 더 많은 행을 추가하는 데 사용할 수있는 생성 된 행에 커서가 있습니다. Btw : 당신이 일했던 나라의 인사 ...;) – Lucero
니스, 그것을 즐겨라! – Raffaeu
어떻게 파일은 폴더에 관련이 있는가? 그리고 나무의 예상 출력 (형식)은 무엇입니까? – Lucero
항상 ParentID를 사용합니다. 두 테이블 모두 Folder.ID 필드를 가리키는 ParentID 필드가 있습니다. – Raffaeu