时间:2021-07-01 10:21:17 帮助过:48人阅读
问题:如何利用一张表,存放c盘的所有文件路径,然后可以查出它的完整路径?思路是这样的,用一张表,有一个id,一个 【parentid】存放父文件的路径 这样,这样不断的根据parentid查找,一直找到 null 就可以实现了。 但是实际的sql语句要如何写了,今天在csdn
问题:如何利用一张表,存放c盘的所有文件路径,然后可以查出它的完整路径?思路是这样的,用一张表,有一个id,一个 【parentid】存放父文件的路径这样,这样不断的根据parentid查找,一直找到 null 就可以实现了。
但是实际的sql语句要如何写了,今天在csdn遇到这个问题。以下是解决方案:
1.利用 with 关键字 该方法有一个重要的特点,就是在with里面可以引用自己,这样就构成[递归查询](见数据库帮助)
2.递归查询里的第一个定位(union all前面) 称为定位成员。如果要使用递归查询,必须使用 union all(没有编译不能通过),连接定位成员和第一个递归
3.递归查询后的结果,会赋值给引用的自己
4.递归的结束条件是,当递归返回的结果集为空时(注意,使用了union all会去掉重复的行,所以,才会有空)
DECLARE @t TABLE (ID int, ParentID int, FName varchar(30)) insert into @t select 1,NULL,'C:' union all select 2,1,'windows' union all select 3,1,'system' union all select 4,2 ,'mywindos' union all select 5,4,'protectapp' union all select 6,3,'sql server' union all select 7,6,'sql prompt' --递归查询 ;with t as ( select ID,ParentID,FName,FName tPath from @t where ParentID is null union all select t2.ID,t2.ParentID,t2.FName, CAST(t1.tPath+'\'+t2.FName AS varchar(30)) tPath ----这里必须强制将递归部分的tPath转换 from t t1 join @t t2 on t1.ID = t2.ParentID ) select * from t