正如标题所述,我有一个递归 CTE,当我更改 WHERE 子句中的运算符时,它会崩溃,即使只有两行数据也是如此。
CREATE TABLE #Recursion
(Parent varchar(10), Child varchar(10), TopDate datetime)
INSERT INTO #Recursion (Parent, Child, TopDate)
VALUES
('00003137', '00003137', '2018-08-31'),
('04536347', '00003137', '2017-02-28'),
('05458040', '05458040', '9999-12-31'),
('00269705',' 05458040',' 9999-12-31')
;WITH
Parent AS
( SELECT parent
, child
, 1 as sort
, TopDate
FROM #Recursion
WHERE parent = child
UNION ALL
SELECT s.parent
, d.child
, d.sort + 1
, s.TopDate
FROM Parent as d
JOIN #Recursion s
ON s.child= d.parent
WHERE s.TopDate < d.TopDate
)
SELECT parent
, child
, sort
FROM Parent
ORDER BY parent, sort desc
OPTION (maxrecursion 0);
DROP TABLE #Recursion
如果我这样保留 where 子句,它就可以工作
WHERE s.TopDate < d.TopDate
一旦我将其更改为此,它就会爆炸并且无法完成
WHERE s.TopDate <= d.TopDate
如果日期小于或等于,我确实需要运行一些测试。为什么这不会工作,即使只有两行数据?
这是一些示例数据。请注意日期字段如何相同
parent child sort TopDate
00003137 04536347 2 2017-02-28
00003137 00003137 1 2018-08-31
00269705 00269705 2 9999-12-31
00269705 05458040 1 9999-12-31
除了具有相同 TopDates的数据之外,我可以让它处理所有数据
如果您将根节点建模为具有 parent=child,则必须将它们从递归子句中排除,否则您将陷入无限循环。您
s.TopDate < d.TopDate
目前是查询中唯一防止无限循环的东西。EG,如果改成
<
query<=
会进入死循环。请注意,这(maxrecursion 0)
可能不是一个好主意。还
应该是
由于您似乎是从根节点开始的,因此您需要通过 UNION ALL-ing 行向下
parent
递归,这些行是上一次迭代的child
.