我有一个用于查找原始位置的脚本。它以这样的表格开始:IDPreviousIDLocation 2NULL1235 321236 431239 8111237 981234 1091235 11101237 ...
我有一个用于查找原始位置的脚本。它以如下表格开始:
ID
|
以前的ID
|
地点
|
2
|
无效的
|
1235
|
3
|
2
|
1236
|
4
|
3
|
1239
|
8
|
11
|
1237
|
9
|
8
|
1234
|
10
|
9
|
1235
|
11
|
10
|
1237
|
我想找到选定数量的 ID 值的原始位置
我寻找的结果是:
等级
|
ID
|
原始ID
|
地点
|
原始位置
|
0
|
2
|
2
|
1235
|
1235
|
2
|
4
|
2
|
1239
|
1235
|
0
|
8
|
8
|
1237
|
1237
|
2
|
10
|
8
|
1235
|
1237
|
3
|
11
|
8
|
1237
|
1237
|
ID =2 和 =4 的输出很好。但是,对于 8,10,11,这会导致循环引用并且代码中断。
问题:有没有办法解决这个问题以避免发生错误:
语句终止。语句完成前已用尽最大递归次数 100
并产生所需的输出? 我知道 8 是根,因为它是该链中最小的数字,即使该链中存在循环引用。
这是我目前为 ID 2 和 4 生成输出的脚本。如果删除值 8,10,11,它会起作用
DECLARE @IDs TABLE (
ID INTEGER
,PreviousID INTEGER
,Location INTEGER
)
INSERT INTO @IDs
SELECT 2,null,1235
UNION ALL SELECT 3,2,1236
UNION ALL SELECT 4,3,1239
UNION ALL SELECT 8,11,1237
UNION ALL SELECT 9,8,1234
UNION ALL SELECT 10,9,1235
UNION ALL SELECT 11,10,1237
Select * from @IDs
DECLARE @ORDERID Table (OrderID nvarchar (100))
Insert into @ORDERID values
('2')
,('4')
--,('8')
--,('10')
--,('11')
;WITH q AS (
SELECT 0 lvl, ID, PreviousID,PreviousID LastId
,Location,Location as OriginalLocation
FROM @IDs
where ID in (select OrderID from @ORDERID)
UNION ALL
SELECT lvl+1, q.ID,u.PreviousId,q.PreviousId LastId
,q.Location,u.Location
FROM q
INNER JOIN @IDs u ON u.ID = q.PreviousID
--and q.ID <> u.PreviousID and q.PreviousID <> u.ID
)
select lvl, ID, coalesce(LastId,Id) OriginalId,Location,OriginalLocation
from q
where PreviousId is null
order by id;
非常感谢您的任何提示或建议。
递归 CTE 以及如何克服循环引用错误
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!