获取顶级 parents ID 继承给 SQL 中的所有 children
Get top level parents ID inherit to all children in SQL
我有一个table这样的
ID Name Parent Code
----------------------------------
1 Item1 NULL K123
2 Item2 NULL K324
3 Item3 1 NULL
4 Item4 2 NULL
5 Item5 3 NULL
6 Item6 5 NULL
7 Item7 4 NULL
8 Item8 NULL K567
9 Item9 8 NULL
10 Item10 NULL NULL
---------------------------------
我需要像这样parent继承所有children的代码
ID Name Parent Code
----------------------------------
1 Item1 NULL K123
2 Item2 NULL K324
3 Item3 1 K123
4 Item4 2 K324
5 Item5 3 K123
6 Item6 5 K123
7 Item7 4 K324
8 Item8 NULL K567
9 Item9 8 K567
10 Item10 NULL NULL
---------------------------------
我尝试了下面的 CTE
;with CTE(ID,Name,Parent,Code,[Level]) as
(
select ID,Name,Parent,Code,0 as [Level] from tbl_mytable
union all
select T.ID,T.Name,T.Parent,T.Code,C.[Level]+1 from tbl_mytable T
inner join CTE C on C.Parent=T.ID
)
select * from CTE C
这并不能帮助我实现我正在尝试的目标。我只是 CTE 的初学者,我认为它无法修复。
您使用递归 CTE 的方向是正确的,但您的逻辑有点偏离。考虑这个工作版本:
WITH cte AS (
SELECT * FROM tbl_mytable WHERE Parent IS NULL
UNION ALL
SELECT t1.ID, t1.Name, t1.Parent, COALESCE(t1.Code, t2.Code)
FROM tbl_mytable t1
INNER JOIN cte t2
ON t1.Parent = t2.ID
)
SELECT *
FROM cte
ORDER BY ID;
递归 CTE 的基本情况组件(即联合之前的内容)应该是那些没有 parent 的记录。这就是我们如何知道它们是最高 parent 级别。然后,我们通过将给定级别与紧接其上方的 parent 相匹配来递归加入 CTE。然后,我们用一个技巧从顶层把代码拉下来:
COALESCE(t1.Code, t2.Code)
这将从 parent 的代码之一开始,然后向下传播到 children 的各个级别。
我有一个table这样的
ID Name Parent Code
----------------------------------
1 Item1 NULL K123
2 Item2 NULL K324
3 Item3 1 NULL
4 Item4 2 NULL
5 Item5 3 NULL
6 Item6 5 NULL
7 Item7 4 NULL
8 Item8 NULL K567
9 Item9 8 NULL
10 Item10 NULL NULL
---------------------------------
我需要像这样parent继承所有children的代码
ID Name Parent Code
----------------------------------
1 Item1 NULL K123
2 Item2 NULL K324
3 Item3 1 K123
4 Item4 2 K324
5 Item5 3 K123
6 Item6 5 K123
7 Item7 4 K324
8 Item8 NULL K567
9 Item9 8 K567
10 Item10 NULL NULL
---------------------------------
我尝试了下面的 CTE
;with CTE(ID,Name,Parent,Code,[Level]) as
(
select ID,Name,Parent,Code,0 as [Level] from tbl_mytable
union all
select T.ID,T.Name,T.Parent,T.Code,C.[Level]+1 from tbl_mytable T
inner join CTE C on C.Parent=T.ID
)
select * from CTE C
这并不能帮助我实现我正在尝试的目标。我只是 CTE 的初学者,我认为它无法修复。
您使用递归 CTE 的方向是正确的,但您的逻辑有点偏离。考虑这个工作版本:
WITH cte AS (
SELECT * FROM tbl_mytable WHERE Parent IS NULL
UNION ALL
SELECT t1.ID, t1.Name, t1.Parent, COALESCE(t1.Code, t2.Code)
FROM tbl_mytable t1
INNER JOIN cte t2
ON t1.Parent = t2.ID
)
SELECT *
FROM cte
ORDER BY ID;
递归 CTE 的基本情况组件(即联合之前的内容)应该是那些没有 parent 的记录。这就是我们如何知道它们是最高 parent 级别。然后,我们通过将给定级别与紧接其上方的 parent 相匹配来递归加入 CTE。然后,我们用一个技巧从顶层把代码拉下来:
COALESCE(t1.Code, t2.Code)
这将从 parent 的代码之一开始,然后向下传播到 children 的各个级别。