CTE取得父母的所有子女(后代)

山姆·卡普

我有这个问题让我头疼...

说,我有一个包含数千行的表,该表的结构由父->子关系组成。

关系可以上升到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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取所有父母的子女父母关系

来自分类Dev

XSLT:获取具有指定属性的父母的所有子女

来自分类Dev

与所有衍生子女共享父母财产价值

来自分类Dev

获取表中所有记录的父母/子女

来自分类Dev

父母联谊会的条件范围,使所有子女

来自分类Dev

HierarchyID:获取所有后代以获得父母列表

来自分类Dev

查询以列出所有等级的父母和兄弟姐妹及其子女,但不列出自己的子女

来自分类Dev

子女div没有回应父母的相对财产

来自分类Dev

JPA父母/子女关系

来自分类Dev

子女与父母之间的联系

来自分类Dev

访问父母的最近子女

来自分类Dev

SQL查找所有后代

来自分类Dev

父母与子女的树形结构

来自分类Dev

MySQL计数父母和子女

来自分类Dev

JPA更新父母子女

来自分类Dev

MS Access父母/子女关系

来自分类Dev

SQLAlchemy过滤父母的父母和子女表

来自分类Dev

有效收集模型的所有(大)孙子女

来自分类Dev

让所有父母为孩子

来自分类Dev

针对父母的所有孩子

来自分类Dev

所有标签后代的选择器

来自分类Dev

执行延迟查询以识别所有后代?

来自分类Dev

如何获得此数组的所有后代?

来自分类Dev

获取对象和所有后代对象

来自分类Dev

阅读单个元素的所有后代

来自分类Dev

所有嵌套后代深嵌套

来自分类Dev

选择除班级子女以外的所有元素

来自分类Dev

如何使“父母-子女-父母”范围保留在“父母”内部?

来自分类Dev

jQuery-查找任何级别的所有后代,但找不到这些后代的后代