首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CTE内部的参考CTE?

CTE内部的参考CTE?
EN

Stack Overflow用户
提问于 2015-12-14 17:07:47
回答 1查看 187关注 0票数 1

我在我们的代码库中找到了这个存储的proc:

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[MoveNodes]
(
    @id bigint,
    @left bigint,
    @right bigint,
    @parentid bigint,
    @offset bigint,
    @caseid bigint,
    @userid bigint

)
AS
BEGIN
WITH    q AS
        (
        SELECT  id, parent, lft, rgt, title, type, caseid, userid, 0 AS level,
                CAST(LEFT(CAST(id AS VARCHAR) + REPLICATE('0', 10), 10) AS VARCHAR) AS bc
        FROM    [dbo].DM_FolderTree hc
        WHERE   id = @id and caseid = @caseid
        UNION ALL
        SELECT  hc.id, hc.parent, hc.lft, hc.rgt, hc.title, hc.type, hc.caseid, hc.userid, level + 1,
                CAST(bc + '.' + LEFT(CAST(hc.id AS VARCHAR) + REPLICATE('0', 10), 10) AS VARCHAR)
        FROM    q
        JOIN    [dbo].DM_FolderTree hc
        ON      hc.parent = q.id        
        )
UPDATE [dbo].DM_FolderTree 
    SET lft = ((-lft) + @offset), rgt = ((-rgt) + @offset), userid = @userid
    WHERE id in (select id from q) AND lft <= (-(@left)) AND rgt >= (-(@right)) AND caseid = @caseid;
UPDATE [dbo].DM_FolderTree SET parent = @parentid, userid = @userid WHERE id = @id AND caseid = @caseid;
END

在这里,您会注意到CTE q正在被调用到UNION上。我们到底在这里打什么电话?UNION之前的一切,整个CTE?这里到底发生了什么。

我假设这个代码是合法的,因为它已经生产了很长一段时间(我知道FLW)。但我还是不知道这里发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-14 17:14:39

这是一个递归查询。它一次又一次地调用CTE,直到所有ID和CaseID都遍历了树。

考虑一下目录中文件夹的嵌套。此查询只需遍历所有目录以最终确定所有文件夹中所有文件的“文件路径”。

注意级别从0开始,然后添加到。第二次级别现在是1,变成2,然后是3,依此类推。

为了更好地理解:

获取选择的cte部分(with q as...),并将更新替换为Select * from q并运行它。这样你就能看到它的作用了。从一开始就学得有点粗糙,但是通过做上面的例子来学习会有帮助。

对问题的具体答复:

,我们到底在打什么电话?

您构建的基线表示希望开始的所有根,然后遍历该根/文件夹下的所有级别。因此,在本质上,您正在为hc.parent = q.id爬行整个结构

联盟面前的一切,所有的

整个cte。递归非常酷的东西!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34272715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档