t-sql 查询递归更新数据
t-sql query to update data recursively
Max_ID Second_Max_ID Cumulative_ID
173 97 ,97
174 173 ,97,173
... ... ...
I need to write a query to compute the cumulative id. Can someone help?
It's a temporary table with 3 columns(Max_ID,Second_Max_ID,Cumulative_ID) where I have just Max_ID and Second_Max_ID value in table and I need to compute Cumulative_ID for each row in the same temporary table.
我使用了 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
如何从上面的结果中删除第二行?
你可以试试这个:
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;
这个想法是 递归 CTE(而不是 迭代 方法)。您从没有 parent(Second_Max_ID IS NULL
)的一行开始。
这会向下遍历列表(一个隐藏的 RBAR)并即时进行连接 。
您已使用 v2008 和 v2012 进行标记。如果 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;
您可以使用
- a
WHERE
过滤特殊级别
- TOP 1 与
ORDER BY HierachyLevel DESC
连接以获得最后一个元素(具有最长路径的元素)。
希望对您有所帮助!
Max_ID Second_Max_ID Cumulative_ID
173 97 ,97
174 173 ,97,173
... ... ...
I need to write a query to compute the cumulative id. Can someone help? It's a temporary table with 3 columns(Max_ID,Second_Max_ID,Cumulative_ID) where I have just Max_ID and Second_Max_ID value in table and I need to compute Cumulative_ID for each row in the same temporary table.
我使用了 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
如何从上面的结果中删除第二行?
你可以试试这个:
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;
这个想法是 递归 CTE(而不是 迭代 方法)。您从没有 parent(Second_Max_ID IS NULL
)的一行开始。
这会向下遍历列表(一个隐藏的 RBAR)并即时进行连接 。
您已使用 v2008 和 v2012 进行标记。如果 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;
您可以使用
- a
WHERE
过滤特殊级别 - TOP 1 与
ORDER BY HierachyLevel DESC
连接以获得最后一个元素(具有最长路径的元素)。
希望对您有所帮助!