Sql Server展示树级结构数据,类似ORCAL中的Start With的效果,测试非常有效
2016-09-21 14:36
274 查看
use tempdb
go
CREATE TABLE Hierarchy(ID int PRIMARY KEY, Name varchar(30),
PredecessorNo int NULL REFERENCES Hierarchy (ID))
INSERT Hierarchy VALUES (1,'1A',1)
INSERT Hierarchy VALUES (2,'2B',1)
INSERT Hierarchy VALUES (3,'3C',2)
INSERT Hierarchy VALUES (4,'3D',2)
INSERT Hierarchy VALUES (5,'4E',3)
INSERT Hierarchy VALUES (6,'4F',3)
INSERT Hierarchy VALUES (7,'4G',3)
INSERT Hierarchy VALUES (8,'4H',3)
INSERT Hierarchy VALUES (9,'4I',3)
INSERT Hierarchy VALUES (10,'5J',9)
INSERT Hierarchy VALUES (11,'5K',9)
INSERT Hierarchy VALUES (12,'5L',9)
INSERT Hierarchy VALUES (13,'5M',9)
create procedure uspHierarchyByNodesSelect
@id int
as
BEGIN
CREATE TABLE #queue(lvl int, ID int)
CREATE TABLE #Hierarchy(seq int identity, lvl int,ID int)
DECLARE @lvl int,@curr int
SELECT @lvl=0,@curr=@id
-- 初始化对列,将待查询的根节点当作第一个元素
INSERT INTO #queue(lvl,ID) VALUES(@lvl,@curr)
WHILE(@lvl > -1) BEGIN
-- 确保当前层包含节点
IF EXISTS(SELECT * FROM #queue where lvl=@lvl)
BEGIN
-- 将队列最前面的值取出
SELECT TOP 1 @curr=ID FROM #queue
where lvl=@lvl
DELETE #queue
WHERE lvl=@lvl and ID=@curr
-- 保存得到的结果
INSERT INTO #Hierarchy(lvl,ID) VALUES(@lvl,@curr)
-- 往队列里面塞那些符合条件的值
INSERT #queue
select @lvl+1,ID
FROM Hierarchy
WHERE PredecessorNO=@curr and PredecessorNo <> ID
-- 如果往里面成功塞入了值,则对下一级也尝试塞入队列
if (@@ROWCOUNT > 0) SET @lvl=@lvl+1
END
-- 如果到了这个层级,@lvl层级的元素处理完了,则返回处理它的上一层
ELSE
SET @lvl = @lvl-1
END
-- 得到@id下所有的子节点
SELECT i.ID,i.Name,i.PredecessorNo
FROM #Hierarchy d join Hierarchy i On (d.ID=i.ID)
-- 排除自身
WHERE i.ID <> @id
ORDER BY seq
drop table #Hierarchy
END
exec uspHierarchyByNodesSelect 3
go
CREATE TABLE Hierarchy(ID int PRIMARY KEY, Name varchar(30),
PredecessorNo int NULL REFERENCES Hierarchy (ID))
INSERT Hierarchy VALUES (1,'1A',1)
INSERT Hierarchy VALUES (2,'2B',1)
INSERT Hierarchy VALUES (3,'3C',2)
INSERT Hierarchy VALUES (4,'3D',2)
INSERT Hierarchy VALUES (5,'4E',3)
INSERT Hierarchy VALUES (6,'4F',3)
INSERT Hierarchy VALUES (7,'4G',3)
INSERT Hierarchy VALUES (8,'4H',3)
INSERT Hierarchy VALUES (9,'4I',3)
INSERT Hierarchy VALUES (10,'5J',9)
INSERT Hierarchy VALUES (11,'5K',9)
INSERT Hierarchy VALUES (12,'5L',9)
INSERT Hierarchy VALUES (13,'5M',9)
create procedure uspHierarchyByNodesSelect
@id int
as
BEGIN
CREATE TABLE #queue(lvl int, ID int)
CREATE TABLE #Hierarchy(seq int identity, lvl int,ID int)
DECLARE @lvl int,@curr int
SELECT @lvl=0,@curr=@id
-- 初始化对列,将待查询的根节点当作第一个元素
INSERT INTO #queue(lvl,ID) VALUES(@lvl,@curr)
WHILE(@lvl > -1) BEGIN
-- 确保当前层包含节点
IF EXISTS(SELECT * FROM #queue where lvl=@lvl)
BEGIN
-- 将队列最前面的值取出
SELECT TOP 1 @curr=ID FROM #queue
where lvl=@lvl
DELETE #queue
WHERE lvl=@lvl and ID=@curr
-- 保存得到的结果
INSERT INTO #Hierarchy(lvl,ID) VALUES(@lvl,@curr)
-- 往队列里面塞那些符合条件的值
INSERT #queue
select @lvl+1,ID
FROM Hierarchy
WHERE PredecessorNO=@curr and PredecessorNo <> ID
-- 如果往里面成功塞入了值,则对下一级也尝试塞入队列
if (@@ROWCOUNT > 0) SET @lvl=@lvl+1
END
-- 如果到了这个层级,@lvl层级的元素处理完了,则返回处理它的上一层
ELSE
SET @lvl = @lvl-1
END
-- 得到@id下所有的子节点
SELECT i.ID,i.Name,i.PredecessorNo
FROM #Hierarchy d join Hierarchy i On (d.ID=i.ID)
-- 排除自身
WHERE i.ID <> @id
ORDER BY seq
drop table #Hierarchy
END
exec uspHierarchyByNodesSelect 3
相关文章推荐
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
- 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构
- Data Mining with SQL Server 2005(数据挖掘技术) - 1
- [视频]物联网&集成系统中的物联交互、数据存储、效果展示形成快速解决方案。附:ServerSuperIO 3.6.2 版本发布。
- MS SQL Server树型结构数据显示的SQL语句(纯SQL语句,不用函数)
- ORACLE START WITH 语句的树级结构例子
- [视频]物联网&集成系统中的物联交互、数据存储、效果展示形成快速解决方案。附:ServerSuperIO 3.6.2 版本发布。
- [SQL] 获取 Microsoft SQL Server 2008 的数据表结构
- Oracle树结构查询 start with ... connect by用法简介&sql有向图问题期待新解决方案
- sql server merge into 与update 批量更新1 百万测试数据的性能比较
- SqlServer中提取表结构和表数据的写法
- Windows sql语句正则匹配导出数据到本地 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
- SQL Server AB表同结构的简单数据同步存储过程
- MYSQL5.0 脚本测试笔记【复制表结构和数据SQL语句】
- sqlserver数据导入mysql二: 根据sqlserver表结构创建mysql表的perl代码
- 【吐血分享】SQL Server With As 递归获取层级关系数据
- MS SQL Server树型结构数据显示的SQL语句(纯SQL语句,不用函数)
- SQL SERVER里从一个数据库导出表结构和表数据到另一个表中
- 修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库
- sqlserver数据导入mysql二: 根据sqlserver表结构创建mysql表的perl代码