我在我们的代码库中找到了这个存储的proc:
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)。但我还是不知道这里发生了什么。
发布于 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。递归非常酷的东西!
https://stackoverflow.com/questions/34272715
复制相似问题