我在sql Server 2008数据库中有以下表格:
Id Name ParentFolder -- ---- ------------ 1 Europe NULL 2 Asia NULL 3 Germany 1 4 UK 1 5 China 2 6 India 2 7 Scotland 4
ParentFolder是同一个表中的FK到Id.我想创建一个导致如下的视图:
Id Name FullName -- ---- -------- 1 Europe Europe 2 Asia Asia 3 Germany Europe/Germany 4 UK Europe/UK 5 China Asia/China 6 India Asia/India 7 Scotland Europe/UK/Scotland
正如你所看到的,我需要通过递归地使用ParentFolder关系来构造FullName值任意次数,直到找到NULL.
编辑.表中的每一行“知道”其他行是其父对象,但不知道其在层次结构中的绝对位置.因此,每行将其绝对位置存储在层次结构树中的谱系系统将不合适.
我知道sql Server 2008的层次化功能,但据我所知,它只适用于固定数量的递归级别.然而,在我的情况下,你永远不会知道你会发现多少级别,并且它们可能会从一行到另一行改变.
我也看到了类似的问题.但是,我认为没有人问到在表中的每一行建立“路径”.对不起,如果我错过了
非常感谢.
解决方法
尝试这个:
DECLARE @tbl TABLE ( Id INT,[Name] VARCHAR(20),ParentId INT ) INSERT INTO @tbl( Id,Name,ParentId ) VALUES (1,'Europe',NULL),(2,'Asia',(3,'Germany',1),(4,'UK',(5,'China',2),(6,'India',(7,'Scotland',4),(8,'Edinburgh',7),(9,'Leith',8) ; WITH abcd AS ( -- anchor SELECT id,[Name],ParentID,CAST(([Name]) AS VARCHAR(1000)) AS "Path" FROM @tbl WHERE ParentId IS NULL UNION ALL --recursive member SELECT t.id,t.[Name],t.ParentID,CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) AS "Path" FROM @tbl AS t JOIN abcd AS a ON t.ParentId = a.id ) SELECT * FROM abcd