博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL语句对表中父子节点正向和反向取所有节点
阅读量:6077 次
发布时间:2019-06-20

本文共 2275 字,大约阅读时间需要 7 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
lamp配置多个虚拟站点
查看>>
C++——函数重载
查看>>
poj1251 裸Prim
查看>>
abstract class VS Interfact
查看>>
头像截图上传两种方式(SWFUpload、一个简单易用的flash插件)
查看>>
记录Vue和Jquery混合开发中关于点击事件的一个bug
查看>>
tkinter 12 登录窗口
查看>>
虚拟机
查看>>
net core 环境部署的坑
查看>>
tp5控制器调用,方法调用
查看>>
Spring01-Ioc基本使用
查看>>
phoenix 开发API系列(一)创建简单的http api
查看>>
proguard 混淆android代码
查看>>
正确认识SEO
查看>>
运维监控工具
查看>>
PAT L2-012. 关于堆的判断
查看>>
CSU 1812 三角形和矩形
查看>>
ZUFE OJ 2288 God Wang I
查看>>
POJ 3349 Snowflake Snow Snowflakes
查看>>
python模块—urllib
查看>>