【发布时间】:2017-11-30 21:58:07
【问题描述】:
我有一个问题要解决,即从层次结构中的最低子级到提供的最高级别(由 ID 注明)的总和。本质上,我试图将一个大型容器的 ID 输入到一个递归函数中,该函数计算较低节点的值,然后为该特定 ID 追溯它们。
我正在处理递归 CTE 中的层次结构,并且能够达到如下所示的点:
ALTER FUNCTION [dbo].[tree_from_id](@myid INT) RETURNS TABLE AS
RETURN (
WITH tree_cte (id, ID_PARENT, VOLUME, nlevel, treepath)
as
(SELECT i.id, i.id_parent, i.VOLUME, nlevel = 1, cast(i.id as nvarchar(255)) as treepath
FROM item i
WHERE id = @myid
UNION ALL
SELECT i.ID, i.ID_PARENT, i.VOLUME, tc.nlevel + 1, cast(tc.treepath+' <- ' + cast(i.id as nvarchar(255))as nvarchar(255)) as treepath
FROM tree_cte tc
INNER JOIN
item i ON i.id_parent = tc.id
SELECT * FROM tree_cte
)
GO
这让我可以通过调用如下函数来获取每个项目的级别并显示它们的层次结构:
SELECT * FROM tree_from_id(215548)
其中 215548 是特定项目 ID。
我希望为项目卷实现类似的东西,但我不确定如何从较低的孩子开始聚合并向上滚动到他们的父母。我尝试了与上面相同的方法,但是可以理解的是,它是从父级开始并向下添加到子级的。
另外,有没有办法添加案例来定义是否添加该项目的体积/为其体积使用不同的值?例如 - 如果该项目没有子项,则采用不同的体积尺寸?
谢谢!我正在尝试更多地了解 SQL,发现这对我来说是一个特别困难的问题。
【问题讨论】:
-
嗯,它可以只是
Select sum(volume) as total from tree_from_id(215548)。否则请提供样本数据和所需结果。 -
至于问题的添加案例部分 - 有没有办法将它放在递归转换中?如果在计算中未考虑案例,则总和(体积)将不正确。有没有办法查看该特定项目/ID 是否存在于不同的表中,然后查看添加是否存在?我想这会出现在演员阵容中。此外,这种递归从顶部获取卷并在向下时添加它们 - 有没有办法从孩子开始?谢谢塞尔格!
-
是的,您可以从孩子开始,只需反向打开:
ON i.id = tc.id_parent。是的,您可以将tree_from_id(...)与其他数据连接起来,它可以被视为 SELECT 中的常规表。 -
刚刚尝试过,看看我是否可以解决层次结构。关于为递归添加条件的任何想法?
-
递归中的条件意味着在适当的步骤中断递归,而不是跳过该步骤并继续。
标签: sql sql-server tsql