导航分层数据结构可能很复杂。 SQL Server 的递归公用表表达式 (CTE) 为使用自联接遍历这些树状结构提供了强大的解决方案。
考虑一个典型的分层数据模型,例如类别表:
<code class="language-sql">CREATE TABLE Categories ( Id int PRIMARY KEY, Name nvarchar(MAX), ParentId int FOREIGN KEY REFERENCES Categories(Id) );</code>
这种设计允许任意深度的嵌套类别。 可视化此层次结构(如下所示)突显了使用标准 SQL 查询检索完整谱系的难度。
[插入类别层次结构图像]
递归 CTE 优雅地解决了这个问题。以下查询演示了如何检索类别及其整个祖先:
<code class="language-sql">WITH RecursiveCategoryCTE AS ( SELECT c.Id, c.Name, CAST(c.Name AS nvarchar(MAX)) AS Path FROM Categories AS c WHERE c.ParentId IS NULL UNION ALL SELECT t.Id, t.Name, CAST(r.Path + ',' + t.Name AS nvarchar(MAX)) AS Path FROM RecursiveCategoryCTE AS r JOIN Categories AS t ON t.ParentId = r.Id ) SELECT c.Id, c.Name, c.Path FROM RecursiveCategoryCTE AS c WHERE c.Name = 'Business Laptops';</code>
RecursiveCategoryCTE
首先选择根类别(其中 ParentId
为 NULL)。Categories
表,构建 Path
列来累积祖先名称。SELECT
语句过滤目标类别(“商务笔记本电脑”)及其生成的祖先路径。结果将是:
Id | Name | Path |
---|---|---|
12 | Business Laptops | Computers,Laptops,Business Laptops |
这项技术在许多应用中都很有价值,包括:
这种方法提供了一种简洁高效的方法来在 SQL Server 中导航分层数据。
以上是SQL Server中的递归自连接如何高效检索分层数据?的详细内容。更多信息请关注PHP中文网其他相关文章!