Access数据库一种树形结构的实现和子节点查询
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数据库一种树形结构的实现和子节点查询的更多相关文章
- MongoDB五种树形结构表示法
MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单加载父/子节点
jQuery EasyUI 树形菜单 - 树形菜单加载父/子节点 通常表示一个树节点的方式就是在每一个节点存储一个 parentid. 这个也被称为邻接列表模型. 直接加载这些数据到树形菜单(Tree ...
- 数据库索引 引用树形结构 B-数 B+数
MySQL 为什么使用B+数 B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所谓 ...
- 递归算法结合数据库 解析 java树形结构
1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节 ...
- EasyUI_tree根据数据库数据生成树形结构JSON格式
@Entitypublic class PubComp { @Id private String aguid; // 菜单ID private String pguid; // 父菜单 private ...
- VUE实现Studio管理后台(七):树形结构,文件树,节点树共用一套代码NodeTree
本次介绍的内容,稍稍复杂了一点,用VUE实现树形结构.目前这个属性结构还没有编辑功能,仅仅是展示.明天再开一篇文章,介绍如何增加编辑功能,标题都想好了.先看今天的展示效果: 构建树必须用到递归,使用s ...
- EasyUI 树形菜单加载父/子节点
通常表示一个树节点的方式就是在每一个节点存储一个 parentid. 这个也被称为邻接列表模型. 直接加载这些数据到树形菜单(Tree)是不允许的. 但是我们可以在加载树形菜单之前,把它转换为标准标准 ...
- ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID
使用element-ui tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...
- 两个比较好用的JS方法,用来处理树形结构!
一.平级结构转树形结构 /** * 平级结构转树形结构 * * 示例:const jsonDataTree = listTransToTreeData(jsonData, 'id', 'pid', ' ...
随机推荐
- C#小常识集锦(一)--《更锋利的CSharp代码》读书笔记
❀.采用类似匈牙利命名法为控件命令,对于其他变量申明则不需要了 e.g. Button btnAdd; e.g. TextBox txtUsername; e.g. ListBox lstFileNa ...
- Android APK方式换肤实现原理
现在很多APP都有换肤的功能,例如微博,QQ等应用.这些应用的换肤原理是什么? 在用微博的时候,不难发现,当你要换肤时,先下载并安装一个皮肤apk,然后选择这个皮肤,就可以了. 这种方式就是把皮肤打包 ...
- android UI进阶之实现listview的下拉加载
关于listview的操作五花八门,有下拉刷新,分级显示,分页列表,逐页加载等,以后会陆续和大家分享这些技术,今天讲下下拉加载这个功能的实现. 最初的下拉加载应该是ios上的效果,现在很多应用如新浪微 ...
- iOS开发——实用篇Swift篇&项目开发常用实用技术
项目开发常用实用技术 实现拨打电话 要实现打电话功能,最简单最直接的方式便是:直接跳到拨号界面 (注意:这个需要真机调试,模拟器无效果) UIApplication.sharedApplica ...
- du 和 df命令的区别(超赞)
du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /<filesystem>用于报告文件系统使用的块数.但是,我们可以发现从df命令算出的文 ...
- 设置EXCEL2010打开多个独立窗口
最近发现一个奇怪的问题,发现office中的word和ppt在我使用笔记本分屏幕(双屏)的时候都可以将2份文档分别在2个窗口打开,但是在使用excel的时候却发现不行,最后研究发现原因 ...
- Windows Service 之 详解(二)
一.创建 Windows 服务程序 1.文件 → 新建 → 项目 → 选择 Windows 服务模板,创建 WinService 项目: 选择这个服务的属性,可以打开属性对话框.可配置如下值: [1] ...
- JavaScript与FileSystemObject
什么是FileSystemObject(简称FSO) FSO 即文件系统对象,是一种列表 Windows 磁盘目录和文件,对目录和文件进行删除.新建.复制.剪切.移动等操作的技术.使用 FSO 网站 ...
- log4j个人使用整理
Log4j介绍: 略过. 配置: Eclipse项目中添加log4j.jar到lib下. 在bin目录下新建log4j.properties,编辑好log4j配置文件. 样例分析: log4j.roo ...
- Java设计模式14:常用设计模式之组合模式(结构型模式)
http://blog.csdn.net/jason0539/article/details/22642281