我有一个问题一直困扰着我...
假设我有一张包含数千行数据的表格,这个表格的结构是父子关系。
这些关系可以达到6个级别。以下是表格结构的示例:
ProductId | ParentId | Levels
1174 0 1174
311 1174 311, 1174
1186 311 1186, 311, 1174
448 1186 448, 1186, 311, 1174
3365 448 3365, 448, 1186, 311, 1174
我们有一个进程,通过整个表循环以获取关系并保存“levels”列,但此过程非常缓慢(因为循环),我尝试使用一些cte来获取关系,但失败了。
到目前为止,我已经尝试了这个cte,但它没有达到我的期望,而且似乎在复制行...
;With Parents(ProductId, ParentId, Levels)
As(
Select ProductId, ParentId, Levels
From Products
Where ParentId = 0
Union All
Select p.ProductId, p.ParentId, p.Levels
From Products p
Join Parents cte On cte.ProductId = p.ParentId
)
Select *
From Parents
正如我之前提到的,我们有一个循环遍历表格的过程,它可以完成任务,但可能需要长达30分钟的时间。我的问题是是否有更好的方法来完成这个任务?我知道使用CTE可以实现,但我不太擅长。此外,级别列应该在表格上进行计算和更新,这可行吗?
这里有一个Sqlfiddle,如果有人能帮忙,谢谢!
ParentId
可为空,并使用NULL表示没有父行。这避免了使用“魔数”来表示顶级行或使顶级行成为其自己的父级的混淆,即ProductId
1174与ParentId
1174。 - HABO