选择同一个表中的所有子节点

时间:2013-12-04 13:09:15

标签: sql-server-2008

我需要在同一个表上显示一个孩子的所有父母 我有桌子如下:

CREATE TABLE [dbo].[GOV_SIDE_Tbl](
[Gov_ID] [int] IDENTITY(1,1) NOT NULL,
[Gov_Name] [nvarchar](max) NULL,
[Gov_Parent_ID] [int] NULL

 CONSTRAINT [PK_GOV_SIDE_Tbl] PRIMARY KEY CLUSTERED 
(
[Gov_ID] ASC
 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,           ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] 
) ON [PRIMARY]

我如何使用父ID获得完整的政府名称

ie.
Gov_ID     Gov_Name          Gov_Parent_ID
1       Ministry of Finance      0
2         Finance Dept1          1

所以当我通过Gov_ID = 2时

the returned full name will be:
"Finance Dept1-Ministry of Finance"

1 个答案:

答案 0 :(得分:0)

使用基本条件(ParentID = 0)创建递归函数,获取子ID,然后获取与递归调用结果连接的当前ID的名称。

CREATE function dbo.GetPath (@id int)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @name nvarchar(max);
    DECLARE @parenID int;
    select @name=Name,@parenID=ParentID from [Table] where ID=@id;
    if(@parenID=0)
        RETURN @name;
    RETURN @name +' / '+ dbo.GetPath(@parenID);
END

此解决方案受到32级嵌套调用的约束。