8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

递归 CTE 以及如何克服循环引用错误

user915 2月前

130 0

我有一个用于查找原始位置的脚本。它以这样的表格开始: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
2
4
8
10
11

我寻找的结果是:

等级 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;

非常感谢您的任何提示或建议。

帖子版权声明 1、本帖标题:递归 CTE 以及如何克服循环引用错误
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由user915在本站《t-sql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我有一张包含 XML 列的表。我没有该列的数据字典,也没有 XML 结构的定义。大约有 150 万条记录。从对小样本的目视检查来看,

    我有一张包含 XML 列的表。我没有该列的数据字典,也没有 XML 结构的定义。大约有 150 万条记录。从对小样本的目视检查来看,XML 的结构似乎相当相似。我希望能够运行一些 SQL,以便为我提供所有记录的 XML 结构超集。

    该表称为 Remittance ,该列称为 RemittInstr .

    例如,如果我有两个测试数据记录,其 RemittInstr 列中的 XML 值为:

    第 1 行:

    <ri>
        <Msg Type="MT103">
            <AccountNo>12345678</AccountNo>
            <Description code="ORCSR">Ordering Customer<Description>
        </Msg>
    </ri>
    

    第 2 行:

    <ri>
        <Msg Type="MT202">
            <BICFI>ABCD1234</BICFI>
            <Description code="FI">Financial Institution<Description>
        </Msg>
    </ri>
    

    如何编写返回以下行的查询:

    /ri
    /ri/Msg
    /ri/Msg/@Type
    /ri/Msg/AccountNo
    /ri/Msg/BICFI
    /ri/Msg/Description
    /ri/Msg/Description/@code
    

    这样我就能全面了解所有行的 XML 结构了吗?

    编辑:这与链接的问题完全不同,因为链接的问题只处理单个 XML 值。问题是关于在整个表中的行中查找 XML 的结构。解决此问题的解决方案完全不同。@Charlieface 在下面的评论中提供了一个指向良好解决方案的链接。

返回
作者最近主题: