需要一种从具有层次结构数据的表中获取记录ID的方法

时间:2013-12-25 01:47:10

标签: c# sql-server sql-server-ce

我需要一些帮助才能从表中获取记录ID。基本上我正在处理特定路径的文件夹和文件存储在数据库中的项目。

它包括一个桌面和Windows服务应用程序,我使用SDF文件进行数据库处理,并使用C#

使用ADO.NET处理数据操作

这是我的文件夹表 enter image description here

如您所见,它的层次结构表和FolderId是一个标识列。

现在假设我的数据为

data

我的路径为“E:\ Books \ WCF \ Examples.pdf”。现在我如何从上表中获取“Examples.pdf”文件的FolderId。

我提出了以下方法

方法1: 通过编写递归方法,将文件夹表中与文件夹名称匹配的所有记录作为“WCF”及其完整层次结构。所以我会得到以下数据 enter image description here

现在在我的代码中,我将比较此层次结构列与pdf的上述文件夹路径以获取FolderId。

方法2: 从pdf路径中获取每个文件夹,我将生成看起来像这样的动态查询

select FolderId from Folders where Name='WCF' and
ParentFolderId in (select FolderId from Folders where Name='Books' and
ParentFolderId in (select FolderId from Folders where Name='E:'))

基于我的两种方法,我应该选择哪种方法。性能是一个关键因素,文件夹表可能有超过一百万条记录。随意建议任何更好的方法。

1 个答案:

答案 0 :(得分:0)

测试数据

CREATE TABLE Table_Name50
(ID INT, Name  nvarchar(100), ParentID INT)
GO

INSERT INTO Table_Name50(ID, Name,ParentID)
VALUES
( 1 ,N'E:\',NULL),
( 2, N'Books',  1),
( 3, N'History', 2),
( 4, N'Biology', 2),
( 5, N'Vidoes',   1)
GO

<强>查询

拉出给定ID的完整路径

DECLARE @ID INT = 3

;with CompleteData
as
(
    Select ID,  ParentId from Table_Name50
    UNION
    Select Child.ParentID Id, Parent.ParentID ParentId From Table_Name50   Child
        Left Outer Join Table_Name50 Parent
            on Child.ParentID = parent.ID
    WHERE
        parent.ParentID IS NULL

),
ChildHierarchyData(ID,ParentID, Level)
as
(
    Select ID,ParentID, 0 as Level from CompleteData Where ID = @ID --<-- Your Parameter
    union all
    Select CompleteData.ID, CompleteData.ParentID, ChildHierarchyData.Level +1 from CompleteData 
        INNER Join ChildHierarchyData
            on ChildHierarchyData.ParentID = CompleteData.ID
),
Concatinated(result)
as
(
    Select Cast((select Cast(Name  as nvarchar) + '\' [data()] 
    from ChildHierarchyData CD INNER JOIN  Table_Name50 tbl
    ON CD.ID = tbl.ID
    Order By Level Desc 
    FOR XML Path('')) as Nvarchar(max))
)
select Left(result, len(result)-1) as Result from Concatinated

<强>结果

E:\\ Books\ History