1

我得到了一个 SQL 表,它有一个父子关系,我想以一种可读的格式呈现。

涉及的主要列是抽屉、文件夹、文档。每个抽屉可以有多个与之关联的文件夹,每个文件夹可以有多个与之关联的文档。但是,文件夹和文档不在同一记录中列出。

此表包含项目类型,文件夹和文档都被视为项目。为了关联它们,该表将文件夹的项目编号分配给文档记录中的 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 

我正在寻找的是与此类似的输出:

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

我坚持的部分是如何将 ParentID 绑定到 ItemID。最好的方法是某种联合吗?递归编程到一个新表?我不是 SQL 人 - 我只是剪切和粘贴一些查询,所以请使用小词 :)

4

4 回答 4

0

如果您只深入两个级别,则创建这样的数据可能是有意义的:

DrawerID    FolderID    ItemId    Description    ...

文件夹本身的项目 ID 为 null 或零。

然后你可以查询:

SELECT * FROM table ORDER BY DrawerID, FolderID, ItemID
于 2012-06-07T19:25:44.343 回答
0

标准 SQL 中没有递归。

但是,有一些模式可以解决您遇到的问题,其中之一是嵌套集

于 2012-06-07T19:26:03.013 回答
0

此查询应该可以工作,并在 SQL Server 中对您的数据进行了测试。基本上它是在查询中创建两个伪表来表示文件夹和文档实体,然后在父关系上连接在一起:

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
于 2012-06-07T20:02:36.353 回答
0

如果您知道要处理多少级别,则可以使用自联接。在自联接中,您基本上假装同一个表是一个新表,并用不同的名称为它(T2 或其他)取别名。这个例子可以让你开始:

顺便说一句,您的数据有一个奇怪的问题,应该存在一个类型为 Drawer 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
于 2012-06-07T20:10:30.567 回答