Max_ID Second_Max_ID Cumulative_ID
173 97 ,97
174 173 ,97,173
... ... ...
我需要编写一个查询来计算累积ID。有人可以帮忙吗? 这是一个临时表,具有3列(Max_ID,Second_Max_ID,Cumulative_ID),其中表中只有Max_ID和Second_Max_ID值,我需要为同一临时表中的每一行计算Cumulative_ID。
我使用了shnugo提供的查询,并对查询进行了如下修改-
DECLARE @mockup TABLE(Max_ID INT,Second_Max_ID INT);
INSERT INTO @mockup VALUES
(173 , 97 )
,(174 , 173 );
WITH recCTE AS
(
SELECT Max_ID
,Second_Max_ID
,CAST(Second_Max_ID AS VARCHAR(MAX)) AS Cumulative_ID
FROM @mockup --WHERE Second_Max_ID IS NULL
UNION ALL
SELECT m.Max_ID
,m.Second_Max_ID
,r.Cumulative_ID+','+ cast(m.Second_Max_ID as varchar(max))
FROM @mockup m
INNER JOIN recCTE r ON r.Max_ID=m.Second_Max_ID
)
SELECT * FROM recCTE;
现在得到类似-
的结果Max_ID Second_Max_ID Cumulative_ID
173 97 97
174 173 173
174 173 97,173
如何从结果中删除第二行?
答案 0 :(得分:1)
您可以尝试以下方法:
editPdfDTOList
此想法是递归CTE (而不是迭代方法)。您从没有 parent (DECLARE @mockup TABLE(Max_ID INT,Second_Max_ID INT);
INSERT INTO @mockup VALUES
(97 ,NULL )
,(173 , 97 )
,(174 , 173 )
,(175 , 174 );
WITH recCTE AS
(
SELECT Max_ID
,Second_Max_ID
,CAST(Max_ID AS VARCHAR(MAX)) AS Cumulative_ID
FROM @mockup WHERE Second_Max_ID IS NULL
UNION ALL
SELECT m.Max_ID
,m.Second_Max_ID
,CONCAT(r.Cumulative_ID,',',m.Max_ID)
FROM @mockup m
INNER JOIN recCTE r ON r.Max_ID=m.Second_Max_ID
)
SELECT * FROM recCTE;
)的一行开始。
它遍历列表(一个隐藏的 RBAR )并动态进行串联 。
您已用v2008和v2012标记。如果Second_Max_ID IS NULL
对您不起作用,则可以轻松地将简单的CONCAT()
与所需的转换转换为+
一起使用。
在此版本中,我将添加一个用于层次结构深度的计数器:
varchar
您可以使用
WITH recCTE AS
(
SELECT Max_ID
,Second_Max_ID
,CAST(Max_ID AS VARCHAR(MAX)) AS Cumulative_ID
,1 AS HierarchyLevel
FROM @mockup WHERE Second_Max_ID IS NULL
UNION ALL
SELECT m.Max_ID
,m.Second_Max_ID
,CONCAT(r.Cumulative_ID,',',m.Max_ID)
,r.HierarchyLevel+1
FROM @mockup m
INNER JOIN recCTE r ON r.Max_ID=m.Second_Max_ID
)
SELECT *
FROM recCTE;
进行特殊级别过滤WHERE
关联的TOP 1以获得最后一个元素(路径最长的元素)。希望这会有所帮助!