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

比如UID_等于37的前置任务(PredecessorLink_)值中的PredecessorUID字段指向了33,37(UID_ ),
我想知道他指向的前置任务中,是否引用了自己(还要检查前置任务中的前置任务是否引用了自己)
就是 A引用了B、C、D,而B、C、D引用了 D、E、F,我想知道D、E、F是否引用了A
------解决思路----------------------
把PredecessorLink_预处理一下,拆成类似下面的明细。
数据库不擅长处理不规整的数据,否则就用程序去做。
------解决思路----------------------
循环引用自己,用SQLSERVER的方式就是递归,要SQL2005+才有效,上面已经写得很清楚了
难点不在递归,而是你的数据的结构需要预处理一下~~
那个JSON数据要是用JAVASCRIPT引擎来处理下肯定很快~~
比如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引擎来处理下肯定很快~~