我有一个表 FolderXDoc:
CREATE TABLE [dbo].[FolderXDoc](
[fldid] [int] NOT NULL,
[Xorder] [int] NOT NULL,
[docid] [int] NOT NULL,
CONSTRAINT [FolderXDoc$pk] PRIMARY KEY CLUSTERED
(
[fldid] ASC,
[Xorder] ASC,
[docid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我的应用程序允许此表中的循环引用,因此允许以下数据:
fldid|Xorder|docid
1|1|2
2|1|3
3|1|4
4|1|2
所以文件夹 1 包含文件夹 2,文件夹 2 包含文件夹 3。文件夹 3 包含文件夹 4。文件夹 4 包含文件夹 2,因此我们有一个循环(1/2/3/4/2/3/4/2/3/4/. ..)
现在我想递归检索文件夹的所有包含元素。我用 CTE 试过这个,但由于数据的循环,这不起作用。我想在检测到循环时停止递归。因此,当我检索 1 的包含元素时,我期望结果集 (2,3,4)。
我用用户定义的函数尝试了这个:
CREATE FUNCTION [dbo].[DocChildren](@fldid int)
RETURNS TABLE
AS
RETURN
(
WITH n AS
(SELECT f.fldid, f.docid
FROM folderxdoc f where f.fldid = @fldid
UNION ALL
SELECT n.fldid, nplus1.docid
FROM folderxdoc as nplus1, n
WHERE n.docid = nplus1.fldid and n.docid != @fldid)
SELECT docid FROM n
)
该函数处理起始 id 的循环循环,但当循环发生在包含的元素中时不处理。我能做些什么来解决这个问题?
谢谢你的帮助!