`
sunchaohui_koko
  • 浏览: 59082 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

SQL树查询

    博客分类:
  • java
阅读更多

引用:  
  --测试数据   深度排序    
  DECLARE   @t   TABLE(ID   char(3),PID   char(3),Name   nvarchar(10))  
  INSERT   @t   SELECT   '001',NULL   ,'山东省'  
  UNION   ALL   SELECT   '002','001','烟台市'  
  UNION   ALL   SELECT   '004','002','招远市'  
  UNION   ALL   SELECT   '003','001','青岛市'  
  UNION   ALL   SELECT   '005',NULL   ,'四会市'  
  UNION   ALL   SELECT   '006','005','清远市'  
  UNION   ALL   SELECT   '007','006','小分市'  
   
  --深度排序显示处理  
  --生成每个节点的编码累计(相同当单编号法的编码)  
  DECLARE   @t_Level   TABLE(ID   char(3),Level   int,Sort   varchar(8000))  
  DECLARE   @Level   int  
  SET   @Level=0  
  INSERT   @t_Level   SELECT   ID,@Level,ID  
  FROM   @t  
  WHERE   PID   IS   NULL  
  WHILE   @@ROWCOUNT>0  
  BEGIN  
  SET   @Level=@Level+1  
  INSERT   @t_Level   SELECT   a.ID,@Level,b.Sort+a.ID  
  FROM   @t   a,@t_Level   b  
  WHERE   a.PID=b.ID  
  AND   b.Level=@Level-1  
  END  
   
  --显示结果  
  SELECT   a.*  
  FROM   @t   a,@t_Level   b  
  WHERE   a.ID=b.ID  
  ORDER   BY   b.Sort  
  /*--结果  
  ID       PID       Name                
  ------   ---------   ----------    
  001     NULL   山东省  
  002     001       烟台市  
  004     002       招远市  
  003     001       青岛市  
  005     NULL   四会市  
  006     005       清远市  
  007     006       小分市  
  --*/

--查询指定节点及其所有子节点的函数  
  CREATE   FUNCTION   f_Cid(@ID   char(3))  
  RETURNS   @t_Level   TABLE(ID   char(3),Level   int)  
  AS  
  BEGIN  
  DECLARE   @Level   int  
  SET   @Level=1  
  INSERT   @t_Level   SELECT   @ID,@Level  
  WHILE   @@ROWCOUNT>0  
  BEGIN  
  SET   @Level=@Level+1  
  INSERT   @t_Level   SELECT   a.ID,@Level  
  FROM   tb   a,@t_Level   b  
  WHERE   a.PID=b.ID  
  AND   b.Level=@Level-1  
  END  
  RETURN  
  END  
  GO  
   
  --调用函数查询002及其所有子节点  
  SELECT   a.*  
  FROM   tb   a,f_Cid('002')   b  
  WHERE   a.ID=b.ID  
  /*--结果  
  ID       PID     Name                
  ------   -------   ----------    
  002     001     烟台市  
  004     002     招远市  
  --*/

--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
    FROM @t a,@t_Level b
    WHERE a.PID=b.ID
        AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
  |--烟台市
    |--招远市
  |--青岛市
|--四会市
  |--清远市
    |--小分市
--*/

/*
标题:查询指定节点及其所有子节点的函数
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-05-12
地点:广东深圳
*/

create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null  , '广东省')
insert into tb values('002' , '001' , '广州市')
insert into tb values('003' , '001' , '深圳市')
insert into tb values('004' , '002' , '天河区')
insert into tb values('005' , '003' , '罗湖区')
insert into tb values('006' , '003' , '福田区')
insert into tb values('007' , '003' , '宝安区')
insert into tb values('008' , '007' , '西乡镇')
insert into tb values('009' , '007' , '龙华镇')
insert into tb values('010' , '007' , '松岗镇')
go

--查询指定节点及其所有子节点的函数
create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int)
as
begin
  declare @level int
  set @level = 1
  insert into @t_level select @id , @level
  while @@ROWCOUNT > 0
  begin
    set @level = @level + 1
    insert into @t_level select a.id , @level
    from tb a , @t_Level b
    where a.pid = b.id and b.level = @level - 1
  end
  return
end
go

--调用函数查询001(广东省)及其所有子节点
select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id
/*
id   pid  name      
---- ---- ----------
001  NULL 广东省
002  001  广州市
003  001  深圳市
004  002  天河区
005  003  罗湖区
006  003  福田区
007  003  宝安区
008  007  西乡镇
009  007  龙华镇
010  007  松岗镇

(所影响的行数为 10 行)
*/

--调用函数查询002(广州市)及其所有子节点
select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id
/*
id   pid  name      
---- ---- ----------
002  001  广州市
004  002  天河区

(所影响的行数为 2 行)
*/

--调用函数查询003(深圳市)及其所有子节点
select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id
/*
id   pid  name      
---- ---- ----------
003  001  深圳市
005  003  罗湖区
006  003  福田区
007  003  宝安区
008  007  西乡镇
009  007  龙华镇
010  007  松岗镇

(所影响的行数为 7 行)
*/

drop table tb
drop function f_cid

 

多个的使用临时表组合数据,参考:

 

SQL code

/*
标题:查询所有顶级节点及其子节点的例
地址:http://topic.csdn.net/u/20090323/21/63a91f51-c4df-464d-ba18-64343deb4e3a.html
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2009-03-23
地点:广东深圳
*/

[code=SQL]create table Area (id int identity,Name varchar(10) ,order_by int ,father_ID int )
insert into area values('广东省',2,0)
insert into area values('四川省',2,0)
insert into area values('湖北省',2,0)
insert into area values('东莞市',1,1)
insert into area values('广州市',1,1)
insert into area values('天河区',0,5)
insert into area values('绵阳市',1,2)
insert into area values('武汉市',1,3)
insert into area values('汉口区',0,8)
insert into area values('随州市',1,3)
go

select * from area

drop table area

/*
id          Name       order_by    father_ID  
----------- ---------- ----------- -----------
1           广东省        2           0
2           四川省        2           0
3           湖北省        2           0
4           东莞市        1           1
5           广州市        1           1
6           天河区        0           5
7           绵阳市        1           2
8           武汉市        1           3
9           汉口区        0           8
10          随州市        1           3

(所影响的行数为 10 行)

要求显示为:
name          
--------------
广东省
  东莞市
  广州市
    天河区
四川省
  绵阳市
湖北省
  武汉市
    汉口区
  随州市

(所影响的行数为 10 行)
*/
SQL code

--创建原始表
create table Area (id int identity,Name varchar(10) ,order_by int ,father_ID int )
insert into area values('广东省',2,0)
insert into area values('四川省',2,0)
insert into area values('湖北省',2,0)
insert into area values('东莞市',1,1)
insert into area values('广州市',1,1)
insert into area values('天河区',0,5)
insert into area values('绵阳市',1,2)
insert into area values('武汉市',1,3)
insert into area values('汉口区',0,8)
insert into area values('随州市',1,3)
--创建临时表
create table tmp (id int identity,Name varchar(10) ,order_by int ,father_ID int )
go

--创建查询指定节点及其所有子节点的函数
create function f_cid(@ID int) returns @t_level table(id int , level int)
as
begin
  declare @level int
  set @level = 1
  insert into @t_level select @id , @level
  while @@ROWCOUNT > 0
  begin
    set @level = @level + 1
    insert into @t_level select a.id , @level
    from area a , @t_Level b
    where a.father_ID = b.id and b.level = @level - 1
  end
  return
end
go

--创建存储过程并将数据插入临时表
create proc my_proc
as
begin
  declare @id as int
  set @id = 0
  while exists(select 1 from area where order_by = 2 and id > @id)
  begin
    set @id = (select min(id) from area where order_by = 2 and id > @id)
    insert into tmp(Name ,order_by ,father_ID) select a.name,a.order_by ,a.father_id from area a , f_cid(@id) b where a.id = b.id order by a.id
  end
end
go
exec my_proc

--从临时表提取数据并显示
select case when order_by = 2 then name
            when order_by = 1 then '  ' + name
            when order_by = 0 then '    ' + name
       end name
from tmp order by id

drop function f_cid
drop proc my_proc
drop table area , tmp

/*
name          
--------------
广东省
  东莞市
  广州市
    天河区
四川省
  绵阳市
湖北省
  武汉市
    汉口区
  随州市

(所影响的行数为 10 行)

*/

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/04/03/4014748.aspx

分享到:
评论

相关推荐

    SQL 查询树形子节点.

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

    用SQL实现树的查询

    ### 用SQL实现树的查询 #### 背景与概念 在计算机科学中,**树形结构**是一种常见的非线性数据结构,用于表示层级关系。这种结构在现实世界中有许多应用,如家谱、组织结构图等。在数据库管理中,尤其是在关系型...

    SQL 高级查询技术

    SQL高级查询技术是数据库管理中不可或缺的一部分,它涵盖了多种复杂操作,使得数据处理更为高效和精确。本章主要探讨三个核心主题:日期和时间处理、层次查询以及分析查询,这些都是Oracle Database 10g系统中重要的...

    部分普通sql查询在hive中的实现方式

    ### 部分普通SQL查询在Hive中的实现方式 Hive是一款基于Hadoop的数据仓库工具,能够对存储在Hadoop文件系统中的数据集进行数据提取、转换、加载(ETL),这是一种可以简化MapReduce编程的工具。由于Hive的设计初衷...

    C++ SQL生成语法树

    在实际应用中,这样的解析系统可以帮助我们更好地理解和优化SQL查询,例如,通过分析语法树来找出性能瓶颈,或者生成SQL语句的可视化表示,便于理解和调试。 总结起来,"C++ SQL生成语法树"是一个涉及词法分析、...

    sqlserver查询分析器免安装版

    SQL Server查询分析器是Microsoft SQL Server数据库管理系统的重要组成部分,它为数据库管理员和开发人员提供了用于编写、测试和执行SQL查询的界面。免安装版本的SQL Server查询分析器为那些不希望或不能在计算机上...

    SqlServer树形结构、层次查询

    SqlServer树形结构、层次查询 结果如下: 1 1 2 1-2 4 1-2-4 5 1-2-5 10 1-2-5-10 8 1-2-5-8 6 1-2-6 3 1-3 7 1-3-7 11 1-3-7-11 9 1-3-7-9 12 1-3-7-9-12 13 1-3-7-9-13 14 1-3-7-9-14

    mysql 树形结构查询

    mysql 树形结构查询 MySQL 树形结构查询是指使用存储过程来实现 MySQL 数据库中的树形结构查询。这种查询方式可以高效地查询树形结构的数据,并且可以根据需要设置递归深度。 MySQL 中的树形结构查询可以使用存储...

    CSharp-SQL.rar_C# sql 查询 txt_C#不让sql换行_c# SQL 树形列表_c# sqlserver操

    本文将深入探讨C#中的SQL查询技术,如何处理SQL语句的换行问题,以及如何创建和展示SQL数据的树形列表。 首先,"CSharp-SQL.rar"是一个压缩包,其中包含了一系列关于C#与SQL交互的实例代码,这可以帮助开发者更好地...

    sql树形数据处理示例

    总结来说,处理SQL中的树形数据需要对递归查询、CTEs以及表自连接等概念有深入理解。通过灵活运用这些技术,我们可以有效地在数据库中构建和查询层级关系,满足各种业务需求。在实际项目中,应根据数据规模和查询...

    Delphi结合SQL实现动态树的数据查询

    本文将深入探讨如何使用Delphi编程环境结合SQL(Structured Query Language)来实现动态树的数据查询。 首先,了解Delphi。Delphi是一款强大的Windows应用程序开发工具,它基于Object Pascal编程语言,并且集成了...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-...第9章 图、树、层次结构和递归查询 附录A 逻辑难题 索引

    sql树形结构使用with

    ### SQL树形结构使用WITH详解 在软件开发过程中,树形结构是非常常见的一种数据组织方式。尤其是在处理具有层级关系的数据时,例如组织架构、产品分类等场景,利用SQL实现树形结构可以极大地提高查询效率与数据管理...

    SQL Server 2005中的SQL简单查询

    ### SQL Server 2005中的SQL简单查询详解 #### 实验目的与内容解析 **实验目的** 1. **掌握SQL Server 2005中附加数据库的方法:** 在SQL Server 2005中,附加数据库是一项基本操作,允许用户将现有的数据库文件...

    sql server 2008 递归查询所有上级或下级数据

    在SQL Server 2008中实现递归查询来获取所有上级或下级数据是一项非常实用的技术,尤其是在处理具有层次结构的数据时。本篇将详细解释如何利用Common Table Expressions (CTE)来完成这样的查询,并对提供的示例代码...

    基于SQL语法树的SQL注入过滤方法研究.pdf

    为有效防范这类攻击,学术界和工业界提出了多种防御策略,其中基于SQL语法树的SQL注入过滤方法因其理论和技术深度,受到了众多安全专家的关注。本文将深入探讨这一方法的原理、实现和效果评估,并展望其未来可能的...

    SQL 递归查询,并将结果集保存在临时表中

    在SQL中,递归查询是一种强大的工具,常用于处理层级数据,例如组织结构、树形菜单等。在给定的场景中,我们需要根据一个特定的节点ID查询出该节点及其所有子节点,并将这些结果存储在一个临时表中。以下是实现这一...

    树查询的SQL语句

    一个属性数据库表,利用sql语句对其查询得到树形的数据库表的记录利用的是数据库的递归查询

Global site tag (gtag.js) - Google Analytics