Maison > base de données > tutoriel mysql > le corps du texte

SQL数据库实现递归查询的几种代码方法

WBOY
Libérer: 2016-06-07 14:55:24
original
1914 Les gens l'ont consulté

SQL数据库实现递归查询的几种代码方法 表结构 ProductCategory CategoryID,Level,ParentCategoryID 数据 1,1,-1 2,1,-1 3,2,1 4,3,3 5,2,2 6,4,5 T-SQL WITH CategoryTemp(CategoryID,ParentCategoryID)--临时表用来保存查到的Category ( SELECT CategoryI

SQL数据库实现递归查询的几种代码方法
表结构

ProductCategory

CategoryID,Level,ParentCategoryID

数据

1,1,-1

2,1,-1

3,2,1

4,3,3

5,2,2

6,4,5

T-SQL

WITH CategoryTemp(CategoryID,ParentCategoryID)--临时表用来保存查到的Category

(

  SELECT CategoryID,ParentCategoryID FROM ProductCategory WHERE ParentCategoryID

  UNION ALL--查询N层

  SELECT pc.CategoryID,ParentCategoryID FROM ProductCategory pc

  LEFT JOIN CategoryTemp ct ON pc.ParentCategoryID=ct.CategoryID

  WHERE ParentCategoryID>0--因为第一层前面已经查出来了,所以这里把第一层筛选掉

)

SELECT CategoryID,ParentCategoryID FROM CategoryTemp

结果

1,-1

2,-1

3,1

4,3

5,2

6,5

如果把ParentCategoryID赋为2,结果则为

5,2

6,5

实例

ID 是否为部门   部门名   上级ID
1       y                       部门0       1
31     y                       部门1       1
32     n                       张三         31
33     n                       李二         31
34     y                       部门2       31
35     n                       王五         34
35     y                       部门3 34
36     n                       小三         35
我想找询   ID   值为   35   下级的所有人员包括下级部门的所有人员

--创建查询函数
create   function   f_id(
@id   int --要查询的id
)returns   @re   table(id   int,level   int)
as
begin
declare   @l   int
set   @l=0
insert   @re   select   id,@l
from   表  
where   上级id=@id
while   @@rowcount> 0
begin
set   @l=@l+1
insert   @re   select   a.id,@l
from   表   a   join   @re   b   on   a.上级id=b.id   and   b.level=@l-1
end
return
end
go

--调用函数进行查询
select   a.*   from   表   a   join   f_id(35)   b   on   a.id=b.id

联合查询

--测试数据
create   table   表(ID   int,是否为部门   char(1),部门名   varchar(10),上级ID   int)
insert   表   select   1   , 'y ', '部门0 '   ,1
union   all   select   31, 'y ', '部门1 '   ,1
union   all   select   32, 'n ', '张三 '   ,31
union   all   select   33, 'n ', '李二 '   ,31
union   all   select   34, 'y ', '部门2 ',31
union   all   select   35, 'n ', '王五 '   ,34
union   all   select   35, 'y ', '部门3 ',34
union   all   select   36, 'n ', '小三 '   ,35
go

--创建查询函数
create   function   f_id(
@id   int --要查询的id
)returns   @re   table(id   int,level   int)
as
begin
declare   @l   int
set   @l=0
insert   @re   select   id,@l
from   表  
where   上级id=@id
while   @@rowcount> 0
begin
set   @l=@l+1
insert   @re   select   a.id,@l
from   表   a   join   @re   b   on   a.上级id=b.id   and   b.level=@l-1
end
return
end
go

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!