我有一个数据库表,如下所示:
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
最多 IDy
.
获得正确的下限很容易(我认为):只需更改WHERE
我想要开始的 ID 的基本情况标准:
-- base case
SELECT x.ID, x.Data
FROM MyTable AS x
WHERE x.PredecessorID='...'
但上限又如何呢?一旦记录具有 ID,如何告诉 CTE 停止递归y
已达到?
由于您正在此处进行迭代,并且在递归术语中获得了 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
就会提前停在这里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)