gpt4 book ai didi

sql - 递归 CTE 如何逐行运行?

转载 作者:行者123 更新时间:2023-12-03 07:15:54 27 4
gpt4 key购买 nike

我想我已经掌握了递归 CTE 的格式,足以编写一个,但仍然发现自己非常沮丧,因为我无法手动处理一个(假装自己是 SQL 引擎并用笔到达结果集)和纸)。 I've found this ,这与我正在寻找的内容很接近,但不够详细。我可以毫无问题地跟踪 C++ 递归函数并理解它是如何运行的——但对于 SQL,我不明白引擎为什么或如何知道停止。 anchor 和递归 block 是否每次都会被调用,或者 anchor 是否在以后的迭代中被跳过? (我对此表示怀疑,但我试图表达我对它似乎跳跃的方式的困惑。)如果每次都调用 anchor ,那么 anchor 如何在最终结果中不会出现多次?我希望有人可以分解第 1 行、第 2 行等,随着结果集的累积,会发生什么以及“内存中”的内容。

我冒昧地偷了我的 example from this page ,因为它似乎是最容易理解的。

DECLARE @tbl TABLE ( 
Id INT
, [Name] VARCHAR(20)
, ParentId INT
)

INSERT INTO @tbl( Id, Name, ParentId )
VALUES
(1, 'Europe', NULL)
,(2, 'Asia', NULL)
,(3, 'Germany', 1)
,(4, 'UK', 1)
,(5, 'China', 2)
,(6, 'India', 2)
,(7, 'Scotland', 4)
,(8, 'Edinburgh', 7)
,(9, 'Leith', 8)
;

WITH abcd
AS (
-- anchor
SELECT id, Name, ParentID,
CAST(Name AS VARCHAR(1000)) AS Path
FROM @tbl
WHERE ParentId IS NULL
UNION ALL
--recursive member
SELECT t.id, t.Name, t.ParentID,
CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) AS "Path"
FROM @tbl AS t
JOIN abcd AS a
ON t.ParentId = a.id
)
SELECT * FROM abcd

最佳答案

将递归CTE视为无限的UNION ALL:

WITH    rows AS
(
SELECT *
FROM mytable
WHERE anchor_condition
),
rows2 AS
(
SELECT *
FROM set_operation(mytable, rows)
),
rows3 AS
(
SELECT *
FROM set_operation(mytable, rows2)
),

SELECT *
FROM rows
UNION ALL
SELECT *
FROM rows2
UNION ALL
SELECT *
FROM rows3
UNION ALL

就您而言,这将是:

WITH    abcd1 AS
(
SELECT *
FROM @tbl t
WHERE ParentId IS NULL
),
abcd2 AS
(
SELECT t.*
FROM abcd1
JOIN @tbl t
ON t.ParentID = abcd1.id
),
abcd3 AS
(
SELECT t.*
FROM abcd2
JOIN @tbl t
ON t.ParentID = abcd2.id
),
abcd4 AS
(
SELECT t.*
FROM abcd3
JOIN @tbl t
ON t.ParentID = abcd3.id
),
abcd5 AS
(
SELECT t.*
FROM abcd4
JOIN @tbl t
ON t.ParentID = abcd4.id
),
abcd6 AS
(
SELECT t.*
FROM abcd5
JOIN @tbl t
ON t.ParentID = abcd5.id
)
SELECT *
FROM abcd1
UNION ALL
SELECT *
FROM abcd2
UNION ALL
SELECT *
FROM abcd3
UNION ALL
SELECT *
FROM abcd4
UNION ALL
SELECT *
FROM abcd5
UNION ALL
SELECT *
FROM abcd6

由于 abcd6 没有产生任何结果,这意味着停止条件。

理论上,递归CTE 可以是无限的,但实际上,SQL Server 会尝试禁止会导致无限记录集的查询。

您可能想阅读这篇文章:

关于sql - 递归 CTE 如何逐行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187850/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com