数据库表中的嵌套数据

时间:2009-09-28 10:04:25

标签: sql ansi-sql

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

父母,孩子,孙子。

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

  1. 检索所有记录 来自特定记录
  2. 检索所有直接记录 特殊记录的孩子 (即只有直接的孩子)
  3. 检索所有记录 特定记录的孙子 (即只有大孩子)
  4. 检索记录的祖父母
  5. 检索记录的父级
  6. 检索所有记录(和他们的 儿童和大孩子)
  7. 我希望此查询以排序方式返回数据,因此我可以创建结构化文档(例如,来自查询结果的XML)。通过“排序”,我的意思是结果集是父母那个孩子的“GROUPED”,那么孙子

    我设计了一个这样的简单表格(PSEUDO CODE):

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

    我有很多问题:

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

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

2 个答案:

答案 0 :(得分:2)

检查sitepoint tutorial

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

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

您应该能够从教程中提供的那些查询中获取所有查询。

答案 1 :(得分:0)

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

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

我想明确指出引用链接中的以下引用(italics mine):

“添加节点

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