SQLServer查询树节点以及所有的子节点
存储树节点表结构:
SQLServer查询树节点以及所有的子节点主要有两种方式:
第一种:通过标量值函数查询:
USE [YXCSC]
GO
/****** Object: UserDefinedFunction [dbo].[GetInfoCustomChildCode] Script Date: 02/20/2014 15:59:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
ALTER FUNCTION [dbo].[GetInfoCustomChildCode]
(
@CUSGRO_ID varchar(50)
)
RETURNS nvarchar(4000)
AS
BEGIN
-- Declare the return variable here
DECLARE @Rtn nvarchar(4000),@Tmp varchar(50) ,@ChildCou int ;
declare tb cursor for Select CUSGRO_ID from CC_CUSGROUP where CUSGRO_PARENTID=@CUSGRO_ID;
open tb;
set @Rtn='';
fetch next from tb into @Tmp
while @@fetch_status=0
begin
if @Rtn<>''
set @Rtn=@Rtn+',';
set @Rtn=@Rtn+convert(varchar(50),@Tmp);
Select @ChildCou=count(*) from CC_CUSGROUP where CUSGRO_PARENTID=convert(varchar(50),@Tmp);
--print @ChildCou
if @ChildCou>0
begin
set @Rtn=@Rtn+','+dbo.GetInfoCustomChildCode(@Tmp);
--return @Rtn
end
fetch next from tb into @Tmp
end
close tb
-- Return the result of the function
if @Rtn<>''
-- set @Rtn=@CUSGRO_ID+','+@Rtn
set @Rtn=Convert(varchar(50),@CUSGRO_ID)+','+@Rtn
else
--set @Rtn=@CUSGRO_ID
set @Rtn=Convert(varchar(50),@CUSGRO_ID)
RETURN @Rtn
END
测试查询:
SELECT dbo.GetInfoCustomChildCode(100000);其中100000为传入的树节点。
此方法返回结果为:@Rtn=10000,100001,100002,100003...形式,如果树节点深度增加,则返回结果超过nvarchar(4000)的最大值,导致数据不准确。对于数据比较多的树,此方法不可取。
第一种:通过表值函数查询:
USE [YXCSC]
GO
/****** Object: UserDefinedFunction [dbo].[GetCustomChildCode] Script Date: 02/20/2014 16:04:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER FUNCTION [dbo].[GetCustomChildCode]
(
@CUSGRO_PARENTID varchar(50)
)
RETURNS
@tree TABLE
(
CUSGRO_PARENTID varchar(20),
CUSGRO_ID varchar(20),
CUSGRO_NAME varchar(50),
lev char(2)
)
AS
BEGIN
DECLARE @lev INT;
SET @lev = 1;
INSERT INTO @tree values(@CUSGRO_PARENTID,@CUSGRO_PARENTID,'11','0');
INSERT INTO @tree
SELECT
CUSGRO_ID, CUSGRO_PARENTID, CUSGRO_NAME, 1
FROM
CC_CUSGROUP
WHERE
CC_CUSGROUP.CUSGRO_PARENTID = @CUSGRO_PARENTID and CUSGRO_FLAG='0';
-- 循环插入.
WHILE @@ROWCOUNT > 0
BEGIN
-- 递增Lev
SET @lev = @lev + 1;
-- 假如存在数据异常,造成过多的循环。
IF @lev > 55
BREAK;
-- 插入数据.
INSERT INTO @tree
SELECT
CC_CUSGROUP.CUSGRO_ID, CC_CUSGROUP.CUSGRO_PARENTID, CC_CUSGROUP.CUSGRO_NAME, @lev
FROM
CC_CUSGROUP
JOIN @tree t
ON ( CC_CUSGROUP.CUSGRO_PARENTID = t.CUSGRO_PARENTID
AND t.lev = @lev - 1)
where CUSGRO_FLAG='0';
END;
RETURN;
END
此方法可以解决树节点数据比较多得情况。
分享到:
相关推荐
在实际应用中,我们需要经常进行树的查询操作,例如查找一个特定节点的所有子节点。本案例提供了一个Java工具类,用于根据父节点递归地查找并返回所有子节点的数据。 首先,我们要理解什么是树查询。在树形结构中,...
sql 查询 所有子节点 方法已经调试通过(sql-server 2005)
首先,我们需要定义一个树节点类,通常包含两个属性:节点值和子节点列表。例如: ```java public class TreeNode { private int value; private List<TreeNode> children; // 构造函数、getter和setter方法...
2. **遍历队列**:在循环中,每次取出队列头部的节点,查询该节点的所有子节点,并将子节点加入队列。 3. **删除节点**:在每次取出节点时,同时删除该节点。 4. **重复步骤2和3**:直到队列为空,即所有相关子节点...
在Delphi编程环境中,删除`TreeView`控件中的节点及其子节点是一项常见的...通过理解和应用上述知识点,你可以掌握在Delphi中删除`TreeView`节点及其子节点的方法,这对于开发涉及树形结构数据管理的应用程序非常重要。
总的来说,根据子节点查找所有父节点的问题涉及到对树形结构的理解和遍历。通过使用合适的搜索算法,我们可以有效地从树的任意子节点追踪到根节点,获取所有中间的父节点。在实际开发中,这样的操作对于理解和操作...
标题中的“根据子节点的金额向上汇总所有父节点的金额”是一个典型的树形结构数据处理问题,常见于组织架构、账目统计或者数据库层次结构的数据分析。这个问题涉及到的知识点包括但不限于: 1. **树形结构**:在...
每个TreeNode可以有子节点(ChildNodes),也可以有自己的文本(Text)、值(Value)以及导航URL(NavigateUrl)。在网页加载时,通过循环遍历数据库查询结果,我们可以创建一系列的TreeNode对象,并将它们添加到...
根据当前节点获取所有父节点信息(18代)SQL根据当前节点递归遍历获取所有父节点信息,短短的SQL可以解决复杂的问题
QTreeView递归实现展开或者闭合某个节点下面的所有子节点 不是一键展开所有,是展开你要操作的节点下面的所有子节点!
在前端实现中,通常使用JSON对象来存储树形数据,每个节点包含一个标识符(ID)、名称、以及指向子节点的引用。展示时,可以通过递归函数将这些数据转化为可交互的HTML元素。 3. **全选和反选(Select All and ...
在Android中,我们可以用Java类来表示一个树节点,包含必要的属性如`value`、`children`列表以及相关的操作方法,如添加子节点、删除子节点等。 其次,为了在界面上展示树结构,我们可能需要自定义一个`TreeView`...
- CSS用来设置样式,使树节点具有折叠/展开的效果,以及良好的视觉层次感。我们可以使用伪类如`:hover`、`:active`来响应用户的交互,使用`margin`、`padding`控制间距,使用`display:none`隐藏未展开的子节点。 3...
如果树的层次深度是已知的且有限,可以使用多次`LEFT JOIN`来查询所有子节点。例如,对于深度为4的树,可以编写如下查询: ```sql SELECT t1.nodename AS level1, t2.nodename AS level2, t3.nodename AS level3, ...
这些节点可能不包含子节点信息,而是存储了获取子节点数据的逻辑(如API调用或数据库查询)。 2. **展开节点事件处理**:当用户展开一个节点时,触发一个事件处理器。这个处理器负责执行预先定义的数据获取逻辑,...
本文将深入探讨如何直接修改C#中的树节点,包括添加、删除和更新节点,以及如何在ASP.NET和SQLDBA环境中操作这些树结构。 首先,我们来理解树节点的基本概念。一个树节点通常包含数据(如对象或字符串)和指向其子...
//JS实现treeview中选中父节点,子节点也选中,如果子节点全部选中,自动选中父节点 //仅支持TreeView //调用方法 TreeView.Attributes.Add("onclick", "OnTreeNodeChecked()");
"动态加载树节点"这一概念就是基于这种思想,它主要用于构建可扩展的、高效的树形数据结构展示。在描述中提到,当用户点击父节点时,会显示“正在加载效果”,然后动态加载对应的子节点。这种方法避免了一次性加载...
本文实例讲述了js树插件zTree获取所有选中节点数据的方法。分享给大家供大家参考。具体分析如下: 由于刚接触Tree方面的东西。在网上看到了zTree,是中国人写的。所以API肯定是中文的。而且评论也很好。所以尝试用...
在本文中,我们将深入探讨如何在ECharts库中实现一个具有点击节点收缩(关闭子节点)功能的树形图表(Tree)。ECharts是一款基于JavaScript的数据可视化库,它提供了丰富的图表类型,包括柱状图、折线图、饼图以及...