SQL语句对表中父子节点正向和反向取所有节点

简介:

CREATE TABLE [ dbo ]. [ temptb ](
[ id ] [ int ] IDENTITY( 1, 1) NOT NULL,
[ pid ] [ int ] NULL,
[ name1 ] [ varchar ]( 20) ,
[ name ] [ nvarchar ]( 50) ,
[ parentid ] [ int ] NULL,
CONSTRAINT [ PK_temptb ] PRIMARY KEY CLUSTERED
(
[ id ] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [ PRIMARY ]
) ON [ PRIMARY ]

GO

/* 创建函数 根据节点id找出其所有父节点*/
create function f_pid( @id int)
returns @re table(id int, level int)
as
begin
declare @l int
set @l = 0
insert @re select @id, @l
while @@rowcount > 0
begin
set @l = @l + 1
insert @re select a.pid, @l
from temptb a, @re b
where a.id =b.id
and b. level = @l - 1
and a.pid <> 0
end
update @re set level = @l - level
return
end
go

/* */
select a. *,b. level
from temptb a,f_pid( 7) b
where a.id =b.id
order by b. level
go


/* 创建函数 根据节点id 找出所有子节点*/
create function c_tree( @initid int) /*定义函数c_tree,输入参数为初始节点id*/
returns @t table(id int,name varchar( 100),parentid int,lev INT,byid int) /*定义表t用来存放取出的数据*/
begin
declare @i int /*标志递归级别*/
set @i = 1
insert @t select id,name,parentid, @i ,byid = @initid from temptb where id = @initid
while @@rowcount <> 0
begin
set @i = @i + 1
insert @t select a.id,a.name,a.parentid, @i, @initid from temptb as a, @t as b
where b.id =a.parentid and b.lev = @i - 1
end
return
END
/*在上面的函数中由于表变量使用了两次,性能很差 ,下面的性能要高些*/

create function [ dbo ]. [ UF_GetOwnerSKUNumber ]()
RETURNS @b table(id int,byid int)
BEGIN
DECLARE @t table(id int,lev INT,byid int)
declare @i int /*标志递归级别*/
set @i = 1
insert @t select c.id, @i ,c.byid
from [ temptb ] c WITH (NOLOCK)
WHERE [ pid ] = 0 OR [ parentid ] IS NULL
OR parentid NOT IN ( SELECT id FROM [ temptb ] WHERE id =c.id)

while @@rowcount <> 0
begin
set @i = @i + 1
insert @b SELECT a.id,b.byid from
[ temptb ] as a WITH (NOLOCK) , @t as b
where b.id =a.parentid and b.lev = @i - 1
end
RETURN
END

select * from c_tree( )
/* 把所有行转换为一个字符串 */
DECLARE @FileClassName nvarchar( max)
SET @FileClassName = ''

SELECT @FileClassName =+ @FileClassName + CONVERT( varchar( 20),id) + ' , ' FROM [ temptb ] a WHERE pid = 0
SELECT @FileClassName AS a



本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2008/05/08/1188592.html,如需转载请自行联系原作者
相关文章
leetcode-SQL-608. 树节点
leetcode-SQL-608. 树节点
104 0
|
6月前
|
SQL 缓存 自然语言处理
【赵渝强老师】OceanBase OBServer节点的SQL层
OceanBase OBServer节点的SQL层将用户的SQL请求转化为对Tablet的数据访问。整个处理流程包括Parser、Resolver、Transformer、Optimizer、CodeGenerator和Executor六大组件,依次完成词法解析、语义解析、逻辑改写、执行计划优化、代码生成及执行任务。同时,SQL层还支持Plan Cache功能,缓存历史执行计划以提升后续查询效率。视频讲解和图示展示了完整的SQL执行过程。
108 6
|
11月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
3652 11
|
SQL 存储
访问者模式问题之在处理 SQL 语句时, IdExpression 和 LiteralExpression 节点如何忽略
访问者模式问题之在处理 SQL 语句时, IdExpression 和 LiteralExpression 节点如何忽略
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之在使用ODPSSQL节点进行SQL任务开发时,如何执行大量的SQL语句
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
259 4
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之赋值节点能否支持CDH sql
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
103 0
|
SQL 数据采集 DataWorks
DataWorks产品使用合集之如何创建Holo SQL节点
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
126 0
|
SQL Oracle 关系型数据库
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
304 0
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_36 树节点
「SQL面试题库」 No_36 树节点