【问题标题】:Get tree structure of folders获取文件夹的树结构
【发布时间】:2010-10-05 22:30:10
【问题描述】:

我的数据库中的“文件夹”表中有以下文件夹:

  • 文件夹 1
  • 文件夹2
  • 文件夹 3
  • 文件夹 4

文件夹路径 - Folder1\Folder2\Folder3\Folder4

当我点击 Folder3 时,我必须将路径设置为 - Folder1\Folder2\Folder3。为此,我传递的是 Folder3 的 folderID。

我怎样才能得到这个结果?

表结构

FolderiD 文件夹名称 ParentID

1 文件夹 1 0

2 文件夹 2 1

3 文件夹3 2

4 文件夹4 3

【问题讨论】:

  • 这与 SQL Server 有什么关系?
  • sql server 和文件夹之间有什么关系?
  • folders的结构是什么?

标签: sql-server


【解决方案1】:

这是我在这里重复这个问题时给出的答案:How to query hierarchical information with SQL-Server 2000?

/* Set up test data */
create table Folders (
    FolderID int,
    FolderName varchar(10),
    ParentID int
)

insert into Folders
    (FolderID, FolderName, ParentID)
    select 1,'Folder1',0 union all
    select 2,'Folder2',1 union all
    select 3,'Folder3',2 union all
    select 4,'Folder4',3        
go

/* Create function */
create function dbo.CreateFolderPath (@FolderID int)
returns varchar(1000)
as
begin
    declare @ParentID int
    declare @FolderPath varchar(1000)
    set @FolderPath = ''

    select @ParentID = ParentID
        from Folders
        where FolderID = @FolderID

    while @ParentID<>0 begin
        select @FolderPath = FolderName + '\' + @FolderPath, @ParentID = ParentID
            from Folders
            where FolderID = @ParentID
    end /* while */

    return @FolderPath
end /* function */
go

/* Demo the function */
select dbo.CreateFolderPath(4)

/* Clean up after demo */
drop function dbo.CreateFolderPath
drop table Folders

【讨论】:

    【解决方案2】:

    您可以为此使用递归 CTE。

    /*Test Data*/
    SELECT *
    INTO #Folders FROM 
    (SELECT 1 AS FolderId, 0 AS ParentId, 'Folder1' AS FolderName UNION ALL
    SELECT 2 AS FolderId, 1 AS ParentId, 'Folder2' AS FolderName UNION ALL
    SELECT 3 AS FolderId, 2 AS ParentId, 'Folder3' AS FolderName UNION ALL
    SELECT 4 AS FolderId, 3 AS ParentId, 'Folder4' AS FolderName ) F
    
    
    /*Query*/    
    ;WITH fl AS
         ( SELECT 1 AS Level,
                 FolderId   ,
                 ParentId   ,
                 FolderName ,
                 CAST(FolderName AS nvarchar(MAX)) AS F
         FROM    #Folders
         WHERE   FolderId = 3
    
         UNION ALL
    
         SELECT Level +1    ,
                f.FolderId  ,
                f.ParentId  ,
                f.FolderName,
                CAST(f.FolderName + '/' + fl.F AS nvarchar(MAX))
         FROM   fl
                JOIN #Folders f
                ON     fl.ParentId = f.FolderId
         )
    SELECT   top (1) F
    FROM     fl
    ORDER BY Level DESC
    
    drop table #Folders
    

    【讨论】:

    • @Adu - 不。您需要为此使用 WHILE 循环或递归调用表值函数。
    猜你喜欢
    • 2021-10-21
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多