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