我目前在理解和编写递归查询时遇到了一些麻烦。我知道递归查询用于搜索信息的层次结构,但我还没有找到一个可以在层次结构中向上移动的简单解决方案。例如,假设我有一个对家谱建模的关系:
create table family_tree (
child varchar(10)
parent varchar(10)
);
如果我想编写一个遍历这个家谱的递归查询,收集所有父母直到起源,我应该怎么做?
提前致谢。
原文由 ac_nook 发布,翻译遵循 CC BY-SA 4.0 许可协议
我目前在理解和编写递归查询时遇到了一些麻烦。我知道递归查询用于搜索信息的层次结构,但我还没有找到一个可以在层次结构中向上移动的简单解决方案。例如,假设我有一个对家谱建模的关系:
create table family_tree (
child varchar(10)
parent varchar(10)
);
如果我想编写一个遍历这个家谱的递归查询,收集所有父母直到起源,我应该怎么做?
提前致谢。
原文由 ac_nook 发布,翻译遵循 CC BY-SA 4.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'
(这是一个有点奇怪的例子,因为实际的孩子有两个父母,但这会让事情变得更复杂。)
原文由 eaolson 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
1.4k 阅读
您可以使用
connect by
子句。在您的情况下,SQL 可能如下所示: