从子行及其“父”创建路径

时间:2014-01-05 07:47:37

标签: sql-server

我有一个包含3个字段的表:

idArticle (int)
idParent (int)
idAlias (nvarchar[255])

我想在该表中添加一个计算列, 这会将Path返回给文章。 也就是说,假设我们有两行:

1,0,"First"
2,1,"Second"

如果我们在第二行运行该函数, 我想在这种情况下Path返回First/Second

根据我的阅读,我需要创建一个Scalar Function作为计算字段, 用idArticle喂它。

我的SQL技能非常局限于基本查询,我不知道如何处理这个问题。 有谁在那里救援?

1 个答案:

答案 0 :(得分:2)

1)首先我创建一个递归内联TVF函数(不是标量函数 - 出于性能原因),以便获得某篇文章@idArticle的路径:

CREATE FUNCTION dbo.GetArticlePath(@idArticle INT)
RETURNS TABLE
AS
RETURN
WITH CteRecursive 
AS
(
    SELECT  cld.idArticle, cld.idParent, CONVERT(NVARCHAR(MAX), cld.idAlias) AS ArticlePath
    FROM    dbo.Article cld
    WHERE   cld.idArticle = @idArticle

    UNION ALL 

    SELECT  prt.idArticle, prt.idParent, prt.idAlias + N'\' + CONVERT(NVARCHAR(MAX), cld.ArticlePath) AS ArticlePath
    FROM    dbo.Article prt INNER JOIN CteRecursive cld ON cld.idParent = prt.idArticle

)
SELECT  *
FROM    CteRecursive rec
WHERE   rec.idParent = 0;
GO

2)样本用法:

SELECT  *
FROM    dbo.GetArticlePath(2) f
/*
idArticle   idParent    ArticlePath
----------- ----------- ------------
1           0           First\Second
*/

3)因此我会使用UPDATE语句来使用此函数:

UPDATE  a
SET     ArticlePath = p.ArticlePath
FROM    dbo.Article a
OUTER APPLY dbo.GetArticlePath(a.idArticle) p
WHERE   a.idArticle = 2;

SELECT  *
FROM    dbo.Article;
/*
idArticle   idParent    idAlias  articlePath
----------- ----------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1           0           First    NULL
2           1           Second   First\Second
*/