您的位置:首页 > 其它

关于父子结构表的两种操作

2007-05-03 22:02 183 查看
现有一父子结构的表(DimProblemType),如下所示:

物理字段名逻辑字段名数据类型
ProblemCode问题编码int
ProblemParentCode父问题编码int
ProblemName问题名称nvarchar(50)
数据如下所示:

ProblemCodeProblemParentCodeProblemName
1A
21B
31C

41D
52E
63F
74G
85H
96I
108J
1、给定一结点,选出所有的子结点
如要显示ProblemCode为3的结点以及它的所有子结点,首创建一表值函数uf_GetSubNode,其函数代码如下:

CREATE FUNCTION [OLAP].[uf_GetSubNode]
(
@problemCode int, -- 问题编码
@isLeaf int -- 是否只返回父结点
)
RETURNS @ProblemCodeTable TABLE
(
[ProblemCode] int,
[NodeLevel] int
)
AS
BEGIN
DECLARE @level int
SET @level = 1

INSERT INTO @ProblemCodeTable
([ProblemCode], [NodeLevel])
SELECT @problemCode, @level

WHILE (@@ROWCOUNT > 0) AND (@isLeaf = 0)
BEGIN
SET @level = @level + 1

INSERT INTO @ProblemCodeTable
([ProblemCode], [NodeLevel])
SELECT A.[ProblemCode], @level
FROM [BaseInfo].[DimProblemType] AS A, @ProblemCodeTable AS B
WHERE (B.[NodeLevel] = @level - 1) AND
(A.[ProbleParentCode] = B.[ProblemCode])
END

RETURN
END

GO

SELECT * FROM [OLAP].[uf_GetSubNode](3, 0)

返回的结果如下:
3 1
6 2
9 3

2、给定一结点,生成出它所在的路径
如要显示ProblemCode为8的路径(A->B->E->H),首先创建一标量函数uf_GetPathString,其函数代码如下:

CREATE FUNCTION [OLAP].[uf_GetPathString]
(
@problemCode int, -- 问题分类编码
@sign nvarchar(100) -- 各问题分类名称之间的分隔符
)
RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @pathString nvarchar(4000)

SELECT @problemCode = [ProblemParentCode], @pathString = [ProblemName]
FROM [BaseInfo].[DimProblemType]
WHERE [ProblemCode] = @problemCode

WHILE @problemCode IS NOT NULL
BEGIN
DECLARE @temp nvarchar(200)

SELECT @problemCode = [ProblemParentCode], @temp = [ProblemName]
FROM [BaseInfo].[DimProblemType]
WHERE [ProblemCode] = @problemCode

SET @pathString = @temp + @sign + @pathString
END

RETURN @pathString
END

GO

SELECT [OLAP].[uf_GetPathString](8, N'->')

返回的结果如下:
A->B->E->H
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐