【问题标题】:how to get all immediate descendants of a node in closure table如何在闭包表中获取节点的所有直接后代
【发布时间】:2021-06-05 17:12:42
【问题描述】:

我在 Uni 有一个关于 SQL 数据库的作业,但我很不擅长。 现在,我的任务是创建一个树形数据库结构(通过使用闭包表模型,如标题所示) 我的树由两个表组成:一个是包含节点本身的表,另一个包含从所有祖先到所有后代的所有路径。 换句话说,它是这样的(我使用了 sqlite,虽然我怀疑它对问题本身很重要,但以防万一):

  CREATE TABLE Nodes(
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 name TEXT);
 CREATE TABLE Paths(
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 ancestor INTEGER,
 descendant INTEGER,
 FOREIGN KEY (ancestor) REFERENCES Nodes (id),
 FOREIGN KEY (descendant) REFERENCES Nodes (id));

表路径包含所有有序对(祖先、后代),因此在树中有一条从祖先到后代的路径,包括祖先 = 后代的所有路径。 我的任务(我非常失败)是编写这样一个查询,它可以让我获得一个节点的所有直接后代。 我已经尝试了大约两个小时,但我仍然处于死胡同。 我还尝试将属性 pathLength 添加到路径表中,以告知祖先和后代之间的节点数,但老师不让我这样做。

【问题讨论】:

  • 发布样本数据和预期结果以阐明您想要什么。

标签: sql sqlite


【解决方案1】:

我能够弄清楚如何,这是我对可能面临类似问题的人的回答。我知道查询可能看起来很糟糕,但这是我现在能给你的最好的了。

select descendant from paths where descendant in (select descendant from paths group by descendant having count(ancestor) = (select count(ancestor) from paths where descendant = **{your node}**) + 1) and ancestor = **{your node}**;

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多