Oracle中的简单递归查询

新手上路,请多包涵

我目前在理解和编写递归查询时遇到了一些麻烦。我知道递归查询用于搜索信息的层次结构,但我还没有找到一个可以在层次结构中向上移动的简单解决方案。例如,假设我有一个对家谱建模的关系:

 create table family_tree (
child varchar(10)
parent varchar(10)
);

如果我想编写一个遍历这个家谱的递归查询,收集所有父母直到起源,我应该怎么做?

提前致谢。

原文由 ac_nook 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 720
2 个回答

您可以使用 connect by 子句。

在您的情况下,SQL 可能如下所示:

 select child, parent, level
from family_tree
connect by prior parent = child

原文由 mkuligowski 发布,翻译遵循 CC BY-SA 3.0 许可协议

有一种我不太熟悉的 ANSI 语法,还有一种我通常使用的 Oracle 语法。 Oracle 语法使用 CONNECT BY ... PRIOR 子句来构建树,并使用 START WITH 子句告诉数据库从何处开始遍历树。它看起来像这样:

 SELECT child, parent, level
  FROM family_tree
CONNECT BY ...
START WITH ...

START WITH 子句更容易。你正在“向上”看树,所以你会选择一个孩子,你想从哪里开始走树。所以这看起来像 START WITH parent = 'John' 。这是我们的 1 级行。我假设约翰的行将有他作为父母,没有孩子,因为它是树的底部。

现在,想想树中的行是如何相互关联的。如果我们正在查看 2 级行,我们如何知道它是否是“John”行的正确行?在这种情况下,它将在子列中有 John。所以我们想要一个子句: CONNECT BY PRIOR parent = child 。这意味着“前一行的父级等于该行的子级”

所以查询看起来像:

 SELECT child, parent, level
  FROM family_tree
CONNECT BY PRIOR parent = child
START WITH parent = 'John'

SQL 小提琴示例

(这是一个有点奇怪的例子,因为实际的孩子有两个父母,但这会让事情变得更复杂。)

原文由 eaolson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进