SQL Server 树形表非循环递归查询

很多人可能想要查询整个树形表关联的内容都会通过循环递归来查...事实上在微软在SQL2005或以上版本就能用别的语法进行查询,下面是示例。

--通过子节点查询父节点
WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = 6  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.PId = Areas.Id

SELECT Area FROM TREE

--通过父节点查询子节点
WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = 7  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.Id = Areas.PId

SELECT Area FROM TREE

通过子节点查询父节点查询结果为:

修改代码为

--通过子节点查询父节点
declare @area varchar(8000);
WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = 6  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.PId = Areas.Id
)
select @area=isnull(@area,‘‘)+Area from Tree order by id 
select Area= @area
则结果为:中国北京市丰台区

根据以上可以将这段代码封装为一个存储过程

-----存储过程,递归获取树形地区表字符串
if exists (select * from sysobjects where name=‘SP_GetAreaStr‘)
drop proc SP_GetAreaStr
go
create procedure SP_GetAreaStr 
 @id int
as
 declare @area varchar(8000)
begin
 WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = @id  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.PId = Areas.Id
)
select @area=isnull(@area,‘‘)+Area from Tree order by id 
select Area= @area
end 
go
--exec sp_helptext ‘SP_GetAreaStr‘
--go
exec SP_GetAreaStr 28
go

查询结果:中国安徽省宿州市灵璧县

所用表结构:

部分数据:

时间: 2024-10-09 19:06:55

SQL Server 树形表非循环递归查询的相关文章

千万级SQL Server数据库表分区的实现

千万级SQL Server数据库表分区的实现 2010-09-10 13:37 佚名 数据库 字号:T | T 一般在千万级的数据压力下,分区是一种比较好的提升性能方法.本文将介绍SQL Server数据库表分区的实现. AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验 最近使用SQL SERVER一个的缓存,数据量一天100w的速度增长,同时接受客户查询,速度由于数据量越来越大越来越慢,这里感谢  KillKill 和 邀约, 最近读了一套书不错,感兴趣的同学可以读读

一个Sql Server 的游标与循环嵌套的存储过程用例

一个Sql Server 的游标与循环嵌套的存储过程用例 准备代码 --创建表 CREATE TABLE everyoneAVG ( ID int primary key identity(1,1), AccNo INT, AVGTime INT, AddTimes INT ); DROP TABLE everyoneAVG; SELECT ID,AccNo AS '用户号',AVGTime/60 AS '平均充值时间间隔(小时)',AddTimes AS '总充值次数' FROM everyo

SQL安装过程中“针对SQL Server 注册表的一致性验证“出错解决方式

1.打开注册表,查找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\0804],分别打开Counter 和Help 2.打开Counter,把滚动条拉倒最后,然后记下最大的那个值(不同计算机不一样的),记下后关闭窗口 3.同样的打开Help,滚动到最后记最大的那个值(你们的值不一定跟我一样的哦!!!),记下后关闭窗口 4,再重新定位到Perflib的节点上, 5.双击Last Counter然后在

SQL Server系统表sysobjects介绍与使用

原文:SQL Server系统表sysobjects介绍与使用 关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可以一个一个地检查表格,但是如果你有500个表格的话,这可能会消耗相当大的人工. 这就让sysobjects表格有了用武之地.虽然我不建议你更新这个表格,但是你当然有权对其进行审查. sysobjects 表 在数据库内创建的每个对象(约

SQL Server查看表结构及视图,适合开发者使用,简单易用

SELECT * FROM INFORMATION_SCHEMA.TABLES SELECT * FROM INFORMATION_SCHEMA.COLUMNS 查看执行结果 SQL Server查看表结构及视图,适合开发者使用,简单易用,布布扣,bubuko.com

sql server 复制表从一个数据库到另一个数据库

sql server 复制表从一个数据库到另一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 f

sql server 更新表,每天的数据分固定批次设置批次号sql

按表中的字段 UpdateTime 按每天进行编号,每天的编号都从1开始编号,并附带表的主键 cid,把数据存入临时表中 WITH temp AS (SELECT cid,updatetime, ROW_NUMBER() OVER (PARTITION BY CONVERT(varchar(10), UpdateTime, 20) ORDER BY updatetime) AS Row_Num FROM Customer_Transfer ) 从临时表中根据主键cid进行更新 BatchNo,给

SQL Server数据库表重置自增主键号(通常是指ID)

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

向SQL Server 现有表中添加新列并添加描述.

注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) 代码 /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' *********