SQL 面试题 目录

SQL 中如何处理树形结构的数据?

推荐答案

在 SQL 中处理树形结构的数据通常使用递归查询或嵌套集模型。以下是两种常见的处理方法:

1. 递归查询(Recursive CTE)

递归查询适用于处理层次结构数据,如组织结构、目录树等。通过递归公共表表达式(CTE),可以轻松地遍历树形结构。

-- -------------------- ---- -------
---- --------- ---- -- -
    -- ----------
    ------ --- ----- ---------
    ---- ----------
    ----- --------- -- ----

    ----- ---

    -- ----------
    ------ ----- ------- -----------
    ---- ---------- -
    ----- ---- ---- -- ----------- - -------
-
------ - ---- -----

2. 嵌套集模型(Nested Set Model)

嵌套集模型通过为每个节点分配左右值来表示树形结构。这种方法适合频繁查询子树或祖先节点的场景。

本题详细解读

1. 递归查询(Recursive CTE)

递归查询的核心思想是通过递归地连接父节点和子节点来遍历整个树形结构。WITH RECURSIVE 是 SQL 标准中用于定义递归 CTE 的语法。

  • 基础查询:选择根节点(即 parent_idNULL 的节点)。
  • 递归查询:通过 INNER JOIN 连接当前结果集和原始表,找到当前节点的子节点。

递归查询的优点是易于理解和实现,适合处理深度不大的树形结构。缺点是对于深度较大的树,性能可能较差。

2. 嵌套集模型(Nested Set Model)

嵌套集模型通过为每个节点分配左右值来表示树形结构。每个节点的左值小于其所有子节点的左值,右值大于其所有子节点的右值。

  • 查询子树:通过比较左右值,可以快速查询某个节点的所有子节点。
  • 查询祖先节点:同样可以通过左右值快速查询某个节点的所有祖先节点。

嵌套集模型的优点是查询性能高,适合频繁查询子树或祖先节点的场景。缺点是插入、删除节点时需要更新大量节点的左右值,维护成本较高。

选择哪种方法?

  • 如果树形结构的深度不大且需要频繁插入、删除节点,推荐使用递归查询。
  • 如果树形结构的深度较大且需要频繁查询子树或祖先节点,推荐使用嵌套集模型。
纠错
反馈