我有这个问题让我头疼...
说,我有一个包含数千行的表,该表的结构由父->子关系组成。
关系可以上升到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
我们有一个遍历整个表以获取关系并保存“级别”列的过程,该过程确实很慢(由于存在循环),我尝试了一些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允许我这样做,但我很讨厌,而且应该在表上计算和更新level列,这可能吗?
这是一个Sqlfiddle,以防有人可以帮助,谢谢!
应该这样做:
WITH MyTest as
(
SELECT P.ProductID, P.ParentID, CAST(P.ProductID AS VarChar(Max)) as Level
FROM Products P
WHERE P.ParentID = 0
UNION ALL
SELECT P1.ProductID, P1.ParentID, CAST(P1.ProductID AS VarChar(Max)) + ', ' + M.Level
FROM Products P1
INNER JOIN MyTest M
ON M.ProductID = P1.ParentID
)
SELECT * From MyTest
这是更新的SQL Fiddle。
另外,请查看此链接以获取有关CTE的帮助...他们一定很高兴知道:
希望这能解决问题!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句