2009-09-28 115 views
2

我有一张表,其中包含以下方式相关的记录:数据库表中的嵌套数据

父母,子女,孙子女。

我想能够运行查询,做到以下几点:

  1. 检索是 从一个特定的记录下来的所有记录
  2. 检索的特定记录的直接 儿童的所有记录 (即只直接孩子)
  3. 检索的特定记录的 孙子 (即只孙子)的所有记录
  4. 检索记录的祖父母
  5. 检索记录
  6. 检索所有的记录(以及他们的 子女和孙子女)

我想这个查询的排序方式返回数据的父母,所以我可以创建一个结构化的文件(例如来自查询结果的XML)。通过“分类”,我的意思是结果集“分组”,由家长THEN孩子,那么孙子

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

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)吗?

+0

ID,parentId的应sufficiant。你使用SQL Server 2005 +? – 2009-09-28 10:07:36

+1

搜索,以便像‘套组’和‘分层数据’,你会发现很多东西条款。 – markus 2009-09-28 10:10:01

+0

您正在使用什么数据库?Oracle有分层查询(CONNECT BY) – Thilo 2009-09-28 10:11:40

回答

2

检查sitepoint tutorial就可以了。

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

所以有id,parent_id,left,right列是你最好的选择。该教程保存了完整的代码,但SQL查询应该足够清楚。

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

0

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

“因此,有ID,PARENT_ID,左,右列是你最好的选择。“

我想明确地指出,从引用链接(斜体矿)以下报价:

”添加节点

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