【问题标题】:Single query to return nested hierarchy rows返回嵌套层次结构行的单个查询
【发布时间】:2018-12-28 07:46:49
【问题描述】:
+----+----------+-------+
| Id | ParentId | Value |
+----+----------+-------+
|  1 |        0 | X     |
|  2 |        1 | X     |
|  3 |        1 | X     |
|  4 |        2 | X     |
+----+----------+-------+

我有一个这样的数据库,限制是:

  • 一行最多是另外 1 行的子行
  • 一行可以有很多子行
  • 可以有更多的嵌套级别

我想要做的查询是将所有行链接到 id=1 的行。所以我需要返回正确层次结构中的所有行。 我想知道是否有一个查询可以帮助我实现这一目标?我知道使用循环是可能的,但它会减慢很多。 如果您对构建此结构的更好方法有任何建议,请告诉我。我不限于修改整个数据库。

【问题讨论】:

  • 您是否需要经常更新数据层次结构?如果没有,您可能需要考虑嵌套集合模型。
  • 编写一个函数 getRootId(Id):当 Id 的 ParentId = 0(或任何你的基本情况)然后是 Id,否则 getRootId(Id's ParentId)。如果您将结果写入列,则此函数可以通过 RootId 已找到 短路进行高度优化。按顺序处理。这甚至可以内置到表触发器中。结果将是一个新列 rootId,它的 Id 始终位于任何记录层次结构的最底部。
  • 标记您的数据库。 SQL 只是一种语言,每个 DB 支持的函数和语法都不一样。

标签: sql hierarchical-data recursive-query


【解决方案1】:

您没有指定您使用的数据库产品,但以下是 ANSI 标准 SQL(并且所有现代 DBMS 都支持):

with recursive tree as (
   select id, parentid, value
   from the_table
   where id = 1
   union all
   select ch.id, ch.parentid, ch.value
   from the_table ch
     join tree p on p.id = ch.parentid
)
select * 
from tree;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多