逐行执行递归 CTE
递归公用表表达式 (CTE) 是支持递归查询的强大 SQL 构造。要了解它们如何执行,请将它们视为一系列 UNION ALL 操作。
考虑提供的示例:
DECLARE @tbl TABLE ( Id INT , [Name] VARCHAR(20) , ParentId INT );
第 1-2 行: 定义表结构体。
第 3-16 行: 将记录插入table.
第 19-24 行: 定义递归 CTE abcd。
第 19 行: 锚表达式定义 CTE 的初始迭代通过选择 ParentId 为 NULL 的记录。
行20-22: 递归表达式通过选择子记录并将其名称与路径列中父级的路径连接起来来扩展 CTE。
第 25 行: 从 CTE abcd 中选择检索最终结果。
执行步骤:
1.执行锚点表达式(第19行),返回以下结果:
Id | Name | ParentId | Path |
---|---|---|---|
1 | Europe | NULL | Europe |
2 | Asia | NULL | Asia |
2. 使用锚表达式的结果执行递归表达式(第 20-22 行)。这将产生:
Id | Name | ParentId | Path |
---|---|---|---|
3 | Germany | 1 | Europe/Germany |
4 | UK | 1 | Europe/UK |
5 | China | 2 | Asia/China |
6 | India | 2 | Asia/India |
3.重复步骤 2,直到找不到更多子记录,结果为:
Id | Name | ParentId | Path |
---|---|---|---|
7 | Scotland | 4 | Europe/UK/Scotland |
8 | Edinburgh | 7 | Europe/UK/Scotland/Edinburgh |
9 | Leith | 8 | Europe/UK/Scotland/Edinburgh/Leith |
4. 合并每次迭代的所有结果以获得 SELECT 语句中显示的最终结果(行25).
为什么锚点不重复:
锚点表达式定义了递归的初始起点。虽然它在每次迭代中执行,但它与递归表达式不同,递归表达式会扩展结果集。因此,锚记录仅包含一次。
以上是递归 CTE 如何逐行执行:分步说明?的详细内容。更多信息请关注PHP中文网其他相关文章!