请找到以下代码:
WITH
CTE(col1, col2, col3, Hier) AS (
SELECT
t.col1,
t.col2,
t.col3,
CAST('/' + LTRIM(t.col2) + '/' AS VARCHAR(MAX))
FROM TABLE t
WHERE t.col2 = 1
UNION ALL
SELECT
t.col1,
t.col2,
t.col3,
hier + CAST(t.col2 AS VARCHAR(MAX)) +'/'
FROM TABLE T
INNER JOIN CTE ON T.col3 = CTE.col3
WHERE CTE.Hier NOT LIKE '%/' + CAST(T.col2 AS VARCHAR(MAX)) + '/%'
)
我遇到上述查询的问题,进入无限循环。基本上我的数据集包含许多数据循环,并且通常的层次结构检查不能在“为什么不起作用”中详细说明。
我考虑使用表变量来存储条目,然后在递归查询部分中检查它,但是找不到从递归查询中插入所述表变量的方法。
我也考虑过使用C#中的函数和重写函数,但我认为在TSQL中肯定会有这样做。
任何想法/解决方案都会很棒。
为什么不起作用?
我的查询中有20多个递归,下面是一个简短的示例摘录
T.col1 | T.col2 | T.col3 | Hier
-------------------------------------------------------------
1 | 2 | 3 | /2/
1 | 2 | 5 | /2/
1 | 3 | 3 | /2/3/
>>>>> Later In Query Results
56 | 57 | 3 | /2/3/5/6/32/34/36/47/48/50/57
56 | 57 | 3 | /2/3/5/6/32/34/36/47/48/50/52/57
除了Hier列之外,底行与上面的行相同,因为条目1的T.col3
值为3
所以它最后加入并且T.col2
是最新的记录的值57
没有出现在条目的{1}的Hier中,因此它被添加,因为这将始终是连续添加行的情况,查询继续运行。
我没有包含数据集,因为它在循环实际开始之前需要大约500多条记录,希望我已经提供了足够的信息来了解我的问题。