循环数据集上的TSQL递归查询

时间:2016-02-05 08:59:55

标签: sql sql-server-2008 tsql recursion

请找到以下代码:

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多条记录,希望我已经提供了足够的信息来了解我的问题。

0 个答案:

没有答案