我可以将这个游标和while循环转换为基于集合的解决方案吗



我目前正在编写一个脚本,其中有一个树、一组已知的父节点(没有一个是根节点(和一组已知子节点。对于每个子节点,我必须找到其中一个父节点的直接后代,该父节点也是该子节点的父节点。对于每个子节点,只有一个这样的值存在,但是在每个子节点与其对应的目标之间可以有任意数量的节点。

我现在拥有的是一个游标,它遍历每个子节点,并使用while循环在树中向上移动,直到它在父节点集中找到一个具有父节点的节点,这就是匹配。我的问题是,我可以在没有光标或while循环的情况下以基于集合的方式解决这个问题吗?我不是sql专家,但无法想出使用合并或联接来实现这一点的方法。

在处理明显困难的树问题时,构建一个"祖先表"通常很有用。这不仅仅是SQL的问题,它还是处理层次结构时使用的常见工具。

祖先表包含各种节点之间的所有连接。因此,如果你有一个根为a、B为a的子项、C为B的子项的图,你的祖先表包含一行从B到a的连接,一行从C到B的连接,一行从C到a的连接,然后可选地包含一个"根"行(从a到a,长度为零(。

一旦你有了这样一张表,大多数问题就会变得更容易公式化。例如,您的问题将变成一组相当简单的连接,以执行以下操作:

在Ancestors中查找行集R1(父行、子行、长度(,其中R1.parent是KnownParent,路径长度为1(这为您提供了KnownParents的直系后代(,然后在Ancetors中查找行集合R2(父行,子行(,其中R2.parent=R1.child,R2.child是KnownChild

生成祖先表可以使用HABO提到的递归CTE来完成。这里有一个现有的stackoverflow答案

祖先表并不是回答这个问题的唯一方法,但它是一个非常有用的学习方法,我建议使用它。当然,您不必持久化祖先,只需直接连接到递归cte的输出即可。

最新更新