掌握 SQL Server 中分层数据的递归自连接
递归自连接对于在 SQL Server 表中导航分层数据结构至关重要。 当处理以父子关系组织的数据(例如组织图表或家谱)时,此技术特别有用。
递归自连接的直接方法使用公共表表达式 (CTE):
<code class="language-sql">WITH q AS ( SELECT * FROM mytable WHERE ParentID IS NULL UNION ALL SELECT m.* FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q;</code>
此查询定义递归 CTE,q
。 初始的 SELECT
语句标识根节点(ParentID
为 NULL 的根节点)。 UNION ALL
将其与后续的 SELECT
语句结合起来,这些语句递归地将 CTE 与 mytable
连接起来以包含所有后代。最后的 SELECT
语句检索完整的分层数据集。
维持等级秩序
为了保留原始的层次结构和顺序,需要修改查询:
<code class="language-sql">WITH q AS ( SELECT m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc FROM mytable m WHERE ParentID IS NULL UNION ALL SELECT m.*, q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q ORDER BY bc;</code>
此增强型查询添加了 bc
列,使用 ROW_NUMBER()
分配唯一标识符,从而维护层次结构每个级别内的顺序。 ORDER BY bc
子句确保最终结果反映原始树结构。 调整 ORDER BY
函数中的 ROW_NUMBER()
子句允许自定义兄弟节点排序。
以上是如何在 SQL Server 中执行递归自连接来探索分层数据?的详细内容。更多信息请关注PHP中文网其他相关文章!