t-sql查询以递归方式更新数据

时间:2019-01-30 17:18:33

标签: sql-server tsql sql-server-2008 sql-server-2012 ssms

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

如何从结果中删除第二行?

1 个答案:

答案 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以获得最后一个元素(路径最长的元素)。

希望这会有所帮助!