怎么查询是否有循环引用自己

如何查询是否有循环引用自己
怎么查询是否有循环引用自己
比如UID_等于37的前置任务(PredecessorLink_)值中的PredecessorUID字段指向了33,37(UID_ ),
我想知道他指向的前置任务中,是否引用了自己(还要检查前置任务中的前置任务是否引用了自己)

就是 A引用了B、C、D,而B、C、D引用了 D、E、F,我想知道D、E、F是否引用了A
------解决思路----------------------
把PredecessorLink_预处理一下,拆成类似下面的明细。
数据库不擅长处理不规整的数据,否则就用程序去做。
WITH table1(UID,PUID) AS (
SELECT 37,31 UNION ALL
SELECT 37,36 UNION ALL
SELECT 31,30 UNION ALL
SELECT 36,33 UNION ALL
SELECT 33,37  '<- 做了个回路'
),
r(UID,PUID,path,hasCycle) AS (
SELECT UID,
       PUID,
       Convert(varchar(max),
               '\'+Convert(varchar(11),UID)+'\'+Convert(varchar(11),PUID)+'\'
              ),
       CASE WHEN UID=PUID
            THEN 1
            ELSE 0
       END
  FROM table1
 WHERE UID=37
 
 UNION ALL
 
SELECT t.UID,
       t.PUID,
       Convert(varchar(max),
               r.path+Convert(varchar(11),t.PUID)+'\'
              ),
       CASE WHEN CHARINDEX('\'+Convert(varchar(11),t.PUID)+'\',r.path)<>0
            THEN 1
            ELSE 0
       END
  FROM r
  JOIN table1 t
    ON t.UID = r.PUID
 WHERE r.hasCycle = 0
)
SELECT *
 FROM r
WHERE hasCycle = 1

        UID        PUID path              hasCycle
----------- ----------- -------------- -----------
         33          37 \37\36\33\37\            1

------解决思路----------------------
循环引用自己,用SQLSERVER的方式就是递归,要SQL2005+才有效,上面已经写得很清楚了

难点不在递归,而是你的数据的结构需要预处理一下~~

那个JSON数据要是用JAVASCRIPT引擎来处理下肯定很快~~