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

现有一父子结构的表(DimProblemType),如下所示:

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

数据如下所示:
ProblemCode ProblemParentCode ProblemName
1 A
2 1 B
3 1

C

4 1 D
5 2 E
6 3 F
7 4 G
8 5 H
9 6 I
10 8 J

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

posted on 2007-05-03 22:02  小石桥  阅读(626)  评论(0)    收藏  举报

导航