gpt4 book ai didi

sql - 如何在 CTE 中停止递归?

转载 作者:行者123 更新时间:2023-12-04 15:53:57 25 4
gpt4 key购买 nike

我有一个看起来像这样的数据库表:

ID                                   | PredecessorID                        | Data
-------------------------------------|--------------------------------------|-----------------
43b1e103-d8c6-40f9-b031-e5d9ef18a739 | null | ...
55f6951b-5ed3-46c8-9ad5-64e496cb521a | 43b1e103-d8c6-40f9-b031-e5d9ef18a739 | ...
3eaa0889-31a6-449d-a499-e4beb9e4cad1 | 55f6951b-5ed3-46c8-9ad5-64e496cb521a | ...

我知道我可以使用(递归)公用表表达式 (CTE) 来获取我的数据的排序列表:
WITH cte (ID, Data)
AS
(
-- base case
SELECT x.ID, x.Data
FROM MyTable AS x
WHERE x.PredecessorID IS NULL

UNION ALL

-- other cases
SELECT x.ID, x.Data
FROM MyTable as x
INNER JOIN cte
ON x.PredecessorID = cte.ID
)
SELECT * FROM cte

虽然这有效,但如果我想获取整个表格,我想知道如何只获取表格的一部分,例如 ID x 之间的所有内容。高达 ID y .

获得正确的下限很容易(我假设):只需更改 WHERE基本情况到我想开始的 ID 的标准:
  -- base case
SELECT x.ID, x.Data
FROM MyTable AS x
WHERE x.PredecessorID='...'

但是上限呢?一旦 ID 为 y 的记录,我如何告诉 CTE 停止递归达到了吗?

最佳答案

由于您在此处进行迭代并且在递归项中获得了它获取的 cte 的最后一个 ID,因此您可以过滤掉最后一次迭代命中“y”的结果

WITH cte (ID, Data)
AS
(
-- base case
SELECT x.ID, x.Data
FROM MyTable AS x
WHERE x.PredecessorID IS NULL

UNION ALL

-- other cases
SELECT x.ID, x.Data
FROM MyTable as x
INNER JOIN cte
ON x.PredecessorID = cte.ID
WHERE cte.id <> 'y'
)
SELECT * FROM cte;

请注意,如果您的 x id 有许多分支,其中一些不会导致 'y',那么这些分支将不断迭代,直到它们达到自然结束点。只有分支通向 y将在这里过早停止。

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

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