![](/img/trans.png)
[英]How to use recursive logic to return only the Root row in a sql table (SQL Server 2008 R2)
[英]How to use recursive logic to update SQL table
我有一个包含以下数据的表:
Id ParentId IsTrue IsBranchHead BranchId
------------------------------------------------
A Null 0 0 Null
B A 1 1 Null
C Null 0 0 Null
D B 1 0 Null
E D 1 0 Null
F A 0 1 Null
G C 0 1 Null
H B 1 0 Null
I E 1 0 Null
J Null 0 0 Null
K J 1 1 Null
L J 1 1 Null
M L 1 0 Null
结构上看起来像这样,使用()中的IsTrue值,第二个区域将始终具有IsBranchHead = 1:
A(0)
F(0)
B(1)
H(1)
D(1)
E(1)
I(1)
C(0)
G(0)
J(0)
K(1)
L(1)
M(1)
当IsTrue = 1时,最终结果表需要将BranchId字段更新为BranchHead的ID到以下结果
Id ParentId IsTrue IsBranchHead BranchId
------------------------------------------------
A Null 0 0 Null
B A 1 1 B
C Null 0 0 Null
D B 1 0 B
E D 1 0 B
F A 0 1 Null
G C 0 1 Null
H B 1 0 B
I E 1 0 B
J Null 0 0 Null
K J 1 1 K
L J 1 1 L
M L 1 0 L
现在,可以在带有循环和某些条件的代码中轻松完成此操作,但是我不知道如何在SQL中执行此操作。 任何帮助将不胜感激!
这是SQL Server的解决方案之一
-- Data
DECLARE @data TABLE ([Id] varchar(1), [ParentId] varchar(1), [IsTrue] int, [IsBranchHead] int, [BranchId] varchar(1));
INSERT INTO @data
VALUES
('A', NULL, 0, 0, NULL),
('B', 'A', 1, 1, NULL),
('C', NULL, 0, 0, NULL),
('D', 'B', 1, 0, NULL),
('E', 'D', 1, 0, NULL),
('F', 'A', 0, 1, NULL),
('G', 'C', 0, 1, NULL),
('H', 'B', 1, 0, NULL),
('I', 'E', 1, 0, NULL),
('J', NULL, 0, 0, NULL),
('K', 'J', 1, 1, NULL),
('L', 'J', 1, 1, NULL),
('M', 'L', 1, 0, NULL)
;
-- Recursive CTE
WITH cte AS
(
SELECT
Id, ParentId, IsTrue, IsBranchHead,
CASE WHEN IsTrue = 1 AND IsBranchHead = 1 THEN Id END AS BranchId
FROM @data WHERE ParentId IS NULL
UNION ALL
SELECT
d.Id, d.ParentId, d.IsTrue, d.IsBranchHead,
CASE
WHEN d.IsTrue = 1 AND d.IsBranchHead = 1 THEN d.Id -- Use Id as BranchId
WHEN d.IsTrue = 1 THEN cte.BranchId -- Copy parent BranchId
ELSE d.BranchId -- Update nothing
END
FROM cte INNER JOIN @data d ON cte.Id = d.ParentId
)
UPDATE target SET BranchId = cte.BranchId FROM @data target INNER JOIN cte
ON target.Id = cte.Id
--SELECT * FROM cte
--ORDER BY Id
SELECT * FROM @data
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.