Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在递归查询中获取项的级别和计数_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 如何在递归查询中获取项的级别和计数

Sql 如何在递归查询中获取项的级别和计数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在这个查询中,我需要获取项目的级别以及该级别上的子级计数 如果有孩子很容易获得级别: 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] = [fi

在这个查询中,我需要获取项目的级别以及该级别上的子级计数
如果有孩子

很容易获得
级别

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

但是要计算孩子的数量是相当棘手的——你几乎必须“预览”任何给定级别的下一个级别;很抱歉,我想不出任何简单的方法来实现这一点。

我假设您只想在文件夹中有文件时包含子文件夹的计数。此外,我假设最上面的文件夹将具有与父文件夹id相同的文件夹id

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
请注意,当父文件夹中没有文件时,查询将不会返回该文件夹,但通过在文件夹表和文件表之间的联接中使用左外部联接,可以相当容易地更改该文件夹

要获取级别,它将非常类似于上面的查询:

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

我需要您在回答中显示的级别和child@user1012819当前位置阅读我的回复-我不认为有任何合理的简单方法来计算孩子的数量。你真正需要它做什么?我在asp.net中创建了一个具有n级的动态菜单,该菜单中的所有级别采用不同的样式,因此我在函数中检查级别并计算子级以更改级别style@user1012819当前位置正如我所说的-我不认为有任何合理的简单方法可以获得孩子数-或者它对性能非常不利(一次又一次的呼叫)或者这真的很难做到。尝试在不提前知道子节点数的情况下构建菜单-当有人单击节点时,动态确定子节点(及其编号)根据需要-不要预先尝试这样做,当我在[folder].[folder\u id]=[File].[folder\u id].[folder\u id]]上注释这一行[--File\u Table[File]时,这几乎是不可能的,但我需要在查询中删除重复数据的级别
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