【问题标题】:Nested data in a database table数据库表中的嵌套数据
【发布时间】:2009-09-28 10:04:24
【问题描述】:

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

父母,孩子,孙子。

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

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

【问题讨论】:

  • id, parentid 应该足够了。您使用的是 sql server 2005+ 吗?
  • 搜索“嵌套集”和“分层数据”等术语,你会发现很多东西。
  • 您使用的是什么数据库? Oracle 有分层查询(CONNECT BY)
  • @Thilo - Scooby 特别要求 ANSI SQL 排除供应商扩展,例如 Oracle,虽然它们很酷。

标签: sql ansi-sql


【解决方案1】:

在此查看sitepoint tutorial

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

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

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

【讨论】:

    【解决方案2】:

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

    “所以最好有 id,parent_id,left,right 列。”

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

    "添加节点

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

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2019-01-22
      • 2019-06-20
      • 2013-08-08
      • 2021-12-22
      • 1970-01-01
      • 2017-05-28
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多