2

我有一个表,其中包含以下列方式相关的记录:

父母,孩子,孙子。

我希望能够运行查询来执行以下操作:

  1. 检索从特定记录派生的所有记录
  2. 检索作为特定记录的直接子项的所有记录(即只有直接子项)
  3. 检索作为特定记录的孙子的所有记录(即只有孙子)
  4. 检索记录的祖父母
  5. 检索记录的父项
  6. 检索所有记录(及其子孙)

我希望这个查询以排序的方式返回数据,这样我就可以创建一个结构化的文档(例如来自查询结果的 XML)。通过“排序”,我的意思是结果集是由父母“分组”的,然后是孩子,然后是孙子

我设计了一个像这样的简单表格(伪代码):

CREATE TABLE family_tree {id integer
                    , parent_id integer
                    , child_id integer
                    , fname varchar(16)
                    , lname varchar(32) };

我有几个问题:

  1. (请记住我要运行的查询 [(1)-(6) 上面])这是最好的(即我可以使用的最有效的表结构?如果不是,什么是?

  2. 任何人都可以帮助我编写 ANSI SQL 语句来执行上述查询 (1)-(6) 吗?

4

2 回答 2

2

检查有关此的站点点教程

  • 存储数据的递归方法(id、parent_id)允许您检索特定节点的直接后代。
  • 预排序树遍历方法允许您检索特定节点的整个分支。

所以有id,parent_id,left,right专栏是你最好的选择。该教程包含完整的代码,但 SQL 查询应该足够清晰。

您应该能够从教程中提供的查询中派生所有查询。

于 2009-09-28T10:11:48.933 回答
0

我看到你已经接受了 Eimantas 的回答,说

“所以拥有 id,parent_id,left,right 列是你最好的选择。”

我想从引用的链接(斜体我的)中明确指出以下引用:

"添加节点

我们如何将节点添加到树中?有两种方法:您可以将父列保留在表中,然后重新运行rebuild_tree() 函数——一个简单但不那么优雅的函数;或者您可以更新新节点右侧所有节点的左右值。"

于 2009-09-28T16:27:05.867 回答