1
WITH cte(folder_id, parent_id, folder_name)
AS
(
    select folder.folder_id, folder.parent_id, folder.folder_name
    FROM Folder_Table [folder] 
        JOIN File_Table [file] on [folder].[folder_id] = [file].[folder_id]
    union all
    select Folder_Table.folder_id,Folder_Table.parent_id,Folder_Table.folder_name
    from cte 
        join Folder_Table on cte.parent_id = Folder_Table.folder_id
)
SELECT distinct * FROM cte

このクエリでは、アイテムのレベルと、子がいる場合はそのレベルでの子の数を取得する必要があります

4

2 に答える 2

2

入手Levelは簡単です:

WITH cte(folder_id, parent_id, folder_name, level)
AS
(
    SELECT
       folder.folder_id, folder.parent_id, folder.folder_name, Level = 0
    FROM 
       Folder_Table [folder] 
    INNER JOIN 
       File_Table [file] on [folder].[folder_id] = [file].[folder_id]

    UNION ALL

    SELECT 
       Folder_Table.folder_id, Folder_Table.parent_id, Folder_Table.folder_name, CTE.Level + 1
    FROM
       cte 
    INNER JOIN 
       Folder_Table on cte.parent_id = Folder_Table.folder_id
)
SELECT DISTINCT * FROM cte

しかし、子の数を取得するのはかなりトリッキーです。特定のレベルの次のレベルを「プレビュー」する必要があります。これを行う簡単な方法は考えられません。申し訳ありません。

于 2012-10-15T17:23:12.290 に答える
0

フォルダにファイルがある場合にのみ、子の数を含めたいと想定しています。また、一番上のフォルダーは、parent_idと同じfolder_idを持つと想定しています。

WITH cte (folder_id, parent_id, folder_name) AS
(
   SELECT folder.folder_id, folder.parent_id, folder.folder_name
   FROM Folder_Table [folder] JOIN File_Table [file] ON [folder].[folder_id] = [file].[folder_id]
   WHERE [folder].parent_id = [folder].folder_id
   UNION ALL
   SELECT folder.folder_id, folder.parent_id, folder.folder_name
   FROM cte JOIN Folder_Table [folder] ON cte.folder_id = folder.parent_id
   WHERE folder.parent_id != folder.folder_id
)
SELECT parent_id, COUNT(1) as [Number of children]
 FROM cte
WHERE folder_id != parent_id
GROUP BY parent_id

そのフォルダーにファイルがない場合、クエリは親フォルダーを返さないことに注意してください。ただし、Folder_TableとFile_Tableの間の結合でLEFT OUTER JOINを使用すると、これを変更するのはかなり簡単です。

レベルを取得するには、上記のクエリと非常によく似ています。

WITH cte (folder_id, parent_id, folder_name, level) AS
(
   SELECT folder.folder_id, folder.parent_id, folder.folder_name, 0
   FROM Folder_Table [folder] JOIN File_Table [file] ON [folder].[folder_id] = [file].[folder_id]
   WHERE [folder].parent_id = [folder].folder_id
   UNION ALL
   SELECT folder.folder_id, folder.parent_id, folder.folder_name, level+1
   FROM cte JOIN Folder_Table [folder] ON cte.folder_id = folder.parent_id
   WHERE folder.parent_id != folder.folder_id
)
SELECT * FROM cte
于 2012-10-15T23:16:08.180 に答える