BOOL CManageDataBase::GetDepTreeAllSons( int rootItem )

{

CADORecordset Rst(&m_DataBase);

BOOL bResult = FALSE;

CString strSQL;

int curItem = rootItem;

int level = 0;

try

{

strSQL.Format(_T("delete from Temp_DepSons"));

if(!m_DataBase.Execute((LPCTSTR)strSQL))

throw IDS_PROC_ERROR;

strSQL.Format(_T("delete from DepSons"));

if(!m_DataBase.Execute((LPCTSTR)strSQL))

throw IDS_PROC_ERROR;

level = 1;

strSQL.Format(_T("insert into Temp_DepSons values(%d,%d)"), curItem, level);

if(!m_DataBase.Execute((LPCTSTR)strSQL))

throw IDS_PROC_ERROR;

while (level > 0)

{

strSQL.Format(_T("select 1 from Temp_DepSons where levelson = %d"), level);

if (!Rst.Open((LPCTSTR)strSQL))

throw 0;

if (Rst.IsEOF())

{

--level;

continue;

}

strSQL.Format(_T("select top 1 item from Temp_DepSons where levelson = %d"), level);

if (!Rst.Open((LPCTSTR)strSQL))

throw 0;

if (!Rst.IsEOF())

{

Rst.GetFieldValue(0, curItem);

}

strSQL.Format(_T("delete from Temp_DepSons where item = %d"), curItem);

if(!m_DataBase.Execute((LPCTSTR)strSQL))

throw IDS_PROC_ERROR;

strSQL.Format(_T("insert into DepSons(id,parentid) select curno, parentno from Deptree where curno = %d"), curItem);

if(!m_DataBase.Execute((LPCTSTR)strSQL))

throw IDS_PROC_ERROR;

strSQL.Format(_T("insert into Temp_DepSons(item,levelson) select curno, %d from Deptree where parentno = %d"), level+1, curItem);

if(!m_DataBase.Execute((LPCTSTR)strSQL))

throw IDS_PROC_ERROR;

if (m_DataBase.GetRecordsAffected() > 0)

{

++level;

}

}

bResult = TRUE;

}

catch (int nID)

{

m_err.SetLastErrorDescription(nID);

}

return bResult;

}

//树型结构

CREATE TABLE `Deptree` (

`CURNO` INTEGER,

`PARENTNO` INTEGER,

`LAYER` BYTE

)

GO

//结果表

CREATE TABLE `DepSons` (

`id` INTEGER,

`parentid` INTEGER

)

GO

CREATE INDEX id ON DepSons(id)

GO

CREATE INDEX parentid ON DepSons(parentid)

GO

//中间表

CREATE TABLE `Temp_DepSons` (

`item` INTEGER,

`levelson` INTEGER

)

GO

CREATE INDEX id ON Temp_DepSons(item)

GO

CREATE INDEX levels ON Temp_DepSons(levelson)

GO

添加数据后的结构如下:

数据库数据如下:

如果是SQL Server 可以写个函数,这样:

CREATE FUNCTION [dbo].[GetDepTreeAllSons](@RootItem as int)

RETURNS @result TABLE ( id int, parentid int)

AS

BEGIN

declare @level int

declare @curItem int

declare @stack table( item int, level int )

set @curItem = @RootItem --根结点编号

set @level = 1

insert into @stack values( @curItem, @level )

while @level > 0

begin

if not exists( select 1 from @stack where level=@level )

begin

set @level = @level - 1

continue ;

end

select top 1 @curItem = item from @stack where level = @level

delete from @stack where item = @curItem

insert into @result select CURNO,PARENTNO from Deptree where CURNO = @curItem

insert into @stack select CURNO,@level+1 from Deptree where PARENTNO=@curItem

if @@rowcount > 0

set @level = @level + 1

end

--输入出结果

return

END

Access数据库一种树形结构的实现和子节点查询的更多相关文章

  1. MongoDB五种树形结构表示法

    MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases ...

  2. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单加载父/子节点

    jQuery EasyUI 树形菜单 - 树形菜单加载父/子节点 通常表示一个树节点的方式就是在每一个节点存储一个 parentid. 这个也被称为邻接列表模型. 直接加载这些数据到树形菜单(Tree ...

  3. 数据库索引 引用树形结构 B-数 B+数

    MySQL 为什么使用B+数 B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所谓 ...

  4. 递归算法结合数据库 解析 java树形结构

    1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节 ...

  5. EasyUI_tree根据数据库数据生成树形结构JSON格式

    @Entitypublic class PubComp { @Id private String aguid; // 菜单ID private String pguid; // 父菜单 private ...

  6. VUE实现Studio管理后台(七):树形结构,文件树,节点树共用一套代码NodeTree

    本次介绍的内容,稍稍复杂了一点,用VUE实现树形结构.目前这个属性结构还没有编辑功能,仅仅是展示.明天再开一篇文章,介绍如何增加编辑功能,标题都想好了.先看今天的展示效果: 构建树必须用到递归,使用s ...

  7. EasyUI 树形菜单加载父/子节点

    通常表示一个树节点的方式就是在每一个节点存储一个 parentid. 这个也被称为邻接列表模型. 直接加载这些数据到树形菜单(Tree)是不允许的. 但是我们可以在加载树形菜单之前,把它转换为标准标准 ...

  8. ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID

    使用element-ui  tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...

  9. 两个比较好用的JS方法,用来处理树形结构!

    一.平级结构转树形结构 /** * 平级结构转树形结构 * * 示例:const jsonDataTree = listTransToTreeData(jsonData, 'id', 'pid', ' ...

随机推荐

  1. Codeforces Gym 100342E Problem E. Minima 暴力

    Problem E. MinimaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/attac ...

  2. iOS开发——UI篇&文字渐变效果:图层中的mask属性

    文字渐变效果:图层中的mask属性 本次文章,主要讲述的是图层中的mask属性,利用它,可以做出文字渐变效果! 一.文字渐变效果: 二.文字渐变实现思路: 1.创建一个颜色渐变层,渐变图层跟文字控件一 ...

  3. SiteMesh学习笔记

    SiteMesh是一个轻量级的web应用框架,实现了Decorator模式.它的目标是将多个页面都将引用的jsp页面通过配置加载到相应的jsp文件中. 在我们的项目中,每个jsp都需要添加两个top和 ...

  4. Flex4之元数据标签使用

    Flex 元数据标签 1.[ArrayElementType] 使用ArrayElementType元数据标签可以让你定义数组元素的数据类型. 程序代码: [ArrayElementType(&quo ...

  5. Oracle数据库的导入与导出

    导出 在命令行输入"exp",回车即可访问指定的数据库, 我这里需要访问远程的数据库,所以带上了IP.端口等一些参数,具体的参数详情可以输入"exp -help" ...

  6. 关于Service常驻内存不被清理的解决方法.

    众所周知, Service是跑后台的. 但是有些Rom厂商把一键清理做的真是太好用了, 以至于一键清理变成了一种习惯, Service已经变的不再是Service了. 那为什么像诸如360, 微信, ...

  7. Android中this.*与*.this还有*.class的区别是什么?

    这些是java的基础知识.首先this代表本类的一个引用,this.*表示调用本类的某个方法,这个时候通常可以省略this:但在内部类中不能省略,否则编译器会认为是内部类的引用,所以要在this前加上 ...

  8. MySQL中的WITH ROLLUP

    MySQL中的WITH ROLLUP MySQL的扩展SQL中有一个非常有意思的应用WITH ROLLUP,在分组的统计数据的基础上再进行相同的统计(SUM,AVG,COUNT…),非常类似于Orac ...

  9. 架构师书单 2nd Edition--转载

    作者:江南白衣,原文出处: http://blog.csdn.net/calvinxiu/archive/2007/03/06/1522032.aspx,转载请保留. 为了2007年的目标,列了下面待 ...

  10. [PHP] Eclipse开发PHP环境配置

    首先准备好软件: 1. Apache,到这里找个最新版本 2. PHP,到这里下载 3. Eclipse IDE for Java EE Developers,到这里下载 4. DLTK Core F ...