关于父子结构表的两种操作
2007-05-03 22:02
183 查看
现有一父子结构的表(DimProblemType),如下所示:
数据如下所示:
1、给定一结点,选出所有的子结点
如要显示ProblemCode为3的结点以及它的所有子结点,首创建一表值函数uf_GetSubNode,其函数代码如下:
返回的结果如下:
3 1
6 2
9 3
2、给定一结点,生成出它所在的路径
如要显示ProblemCode为8的路径(A->B->E->H),首先创建一标量函数uf_GetPathString,其函数代码如下:
返回的结果如下:
A->B->E->H
物理字段名 | 逻辑字段名 | 数据类型 |
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 |
如要显示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
相关文章推荐
- c++ 采用链式结构实现关于入栈,出栈,打印栈的操作
- 关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论
- MyBatis两种操作数据库的结构
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- oracle中关于表的所有操作(创建删除表,修改表结构,创建约束,操作表数据,增删改查等)
- oracle教程之oracle关于表的结构、操作、相关概念解析
- sql server 2005数据库关于数据库本身结构的操作
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- 数据结构关于文本能操作
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- oracle中关于表的所有操作(创建删除表,修改表结构,创建约束,操作表数据,增删改查等)
- 关于线性表的两种储存结构及单链表逆序解析(ArrayList和LinkedList)
- 数据结构之关于树的操作(树的递归和非递归遍历)-(四补)
- oracle中关于表的所有操作(创建删除表,修改表结构,创建约束,操作表数据,增删改查等)
- 数据结构7-关于“图”的生成与操作的实例
- 关于bootstrap-treeview数型结构的转化及使用、增删改等操作
- 数据结构6-关于“树”的生成与操作的实例
- 关于PE病毒编写的学习(6)——关于PE文件结构操作的程序编写
- 数据结构之关于树的操作(树的递归和非递归遍历)
- Java数组和链表两种结构的操作效率,在哪些情况下,哪些操作的效率高