`

查询树节点以及所有子节点

 
阅读更多
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
此方法可以解决树节点数据比较多得情况。




分享到:
评论

相关推荐

    根据父节点找所有子节点数据.zip

    在实际应用中,我们需要经常进行树的查询操作,例如查找一个特定节点的所有子节点。本案例提供了一个Java工具类,用于根据父节点递归地查找并返回所有子节点的数据。 首先,我们要理解什么是树查询。在树形结构中,...

    SQL 查询树形子节点.

    sql 查询 所有子节点 方法已经调试通过(sql-server 2005)

    树父节点递归获取树子节点

    首先,我们需要定义一个树节点类,通常包含两个属性:节点值和子节点列表。例如: ```java public class TreeNode { private int value; private List&lt;TreeNode&gt; children; // 构造函数、getter和setter方法...

    删除数据库表中的父节点以及其子节点

    2. **遍历队列**:在循环中,每次取出队列头部的节点,查询该节点的所有子节点,并将子节点加入队列。 3. **删除节点**:在每次取出节点时,同时删除该节点。 4. **重复步骤2和3**:直到队列为空,即所有相关子节点...

    删除TreeView节点以及其子节点

    在Delphi编程环境中,删除`TreeView`控件中的节点及其子节点是一项常见的...通过理解和应用上述知识点,你可以掌握在Delphi中删除`TreeView`节点及其子节点的方法,这对于开发涉及树形结构数据管理的应用程序非常重要。

    根据子节点查找所有父节点

    总的来说,根据子节点查找所有父节点的问题涉及到对树形结构的理解和遍历。通过使用合适的搜索算法,我们可以有效地从树的任意子节点追踪到根节点,获取所有中间的父节点。在实际开发中,这样的操作对于理解和操作...

    根据子节点的金额向上汇总所有父节点的金额

    标题中的“根据子节点的金额向上汇总所有父节点的金额”是一个典型的树形结构数据处理问题,常见于组织架构、账目统计或者数据库层次结构的数据分析。这个问题涉及到的知识点包括但不限于: 1. **树形结构**:在...

    动态添加树节点

    每个TreeNode可以有子节点(ChildNodes),也可以有自己的文本(Text)、值(Value)以及导航URL(NavigateUrl)。在网页加载时,通过循环遍历数据库查询结果,我们可以创建一系列的TreeNode对象,并将它们添加到...

    根据当前节点获取所有父节点信息

    根据当前节点获取所有父节点信息(18代)SQL根据当前节点递归遍历获取所有父节点信息,短短的SQL可以解决复杂的问题

    QTreeView递归实现展开或者闭合某个节点下面的所有子节点

    QTreeView递归实现展开或者闭合某个节点下面的所有子节点 不是一键展开所有,是展开你要操作的节点下面的所有子节点!

    带复选框的多级目录树,复选框的选择控制子节点父节点 全选和反选

    在前端实现中,通常使用JSON对象来存储树形数据,每个节点包含一个标识符(ID)、名称、以及指向子节点的引用。展示时,可以通过递归函数将这些数据转化为可交互的HTML元素。 3. **全选和反选(Select All and ...

    android树节点例子

    在Android中,我们可以用Java类来表示一个树节点,包含必要的属性如`value`、`children`列表以及相关的操作方法,如添加子节点、删除子节点等。 其次,为了在界面上展示树结构,我们可能需要自定义一个`TreeView`...

    网页上的树节点的制作源代码,生成多个树节点

    - CSS用来设置样式,使树节点具有折叠/展开的效果,以及良好的视觉层次感。我们可以使用伪类如`:hover`、`:active`来响应用户的交互,使用`margin`、`padding`控制间距,使用`display:none`隐藏未展开的子节点。 3...

    MySQL实现树状所有子节点查询的方法

    如果树的层次深度是已知的且有限,可以使用多次`LEFT JOIN`来查询所有子节点。例如,对于深度为4的树,可以编写如下查询: ```sql SELECT t1.nodename AS level1, t2.nodename AS level2, t3.nodename AS level3, ...

    动态加载有子节点的树

    这些节点可能不包含子节点信息,而是存储了获取子节点数据的逻辑(如API调用或数据库查询)。 2. **展开节点事件处理**:当用户展开一个节点时,触发一个事件处理器。这个处理器负责执行预先定义的数据获取逻辑,...

    C#树节点的直接修改

    本文将深入探讨如何直接修改C#中的树节点,包括添加、删除和更新节点,以及如何在ASP.NET和SQLDBA环境中操作这些树结构。 首先,我们来理解树节点的基本概念。一个树节点通常包含数据(如对象或字符串)和指向其子...

    JS实现treeview中选中父节点,子节点也选中,如果子节点全部选中,自动选中父节点

    //JS实现treeview中选中父节点,子节点也选中,如果子节点全部选中,自动选中父节点 //仅支持TreeView //调用方法 TreeView.Attributes.Add("onclick", "OnTreeNodeChecked()");

    动态加载树节点

    "动态加载树节点"这一概念就是基于这种思想,它主要用于构建可扩展的、高效的树形数据结构展示。在描述中提到,当用户点击父节点时,会显示“正在加载效果”,然后动态加载对应的子节点。这种方法避免了一次性加载...

    js树插件zTree获取所有选中节点数据的方法

    本文实例讲述了js树插件zTree获取所有选中节点数据的方法。分享给大家供大家参考。具体分析如下: 由于刚接触Tree方面的东西。在网上看到了zTree,是中国人写的。所以API肯定是中文的。而且评论也很好。所以尝试用...

    echarts tree 点击节点收缩(关闭子节点)功能实现

    在本文中,我们将深入探讨如何在ECharts库中实现一个具有点击节点收缩(关闭子节点)功能的树形图表(Tree)。ECharts是一款基于JavaScript的数据可视化库,它提供了丰富的图表类型,包括柱状图、折线图、饼图以及...

Global site tag (gtag.js) - Google Analytics