求一个递归语句查询

boylafong 2017-09-09 10:03:46
表名 testtable
id name ParentID
1 xf1 0
2 xf2 0
3 xf3 2
4 xf4 3
5 xf5 4
6 xf6 5

找到name为xf6的数据,而xf6的parentID一直往上等于ID的所有数据

希望得到的结果为
id name ParentID
2 xf2 0
3 xf3 2
4 xf4 3
5 xf5 4
6 xf6 5

注意:不要用with
...全文
340 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2017-09-10
  • 打赏
  • 举报
回复
递归一般用cte来实现,如果是SQL、2000无法使用cte,一般是写个方法循环插入临时表实现;
如果楼主要求不用cte、函数、存储过程,那实现方式就是把循环插入的语句直接拿出来运行了。
boylafong 2017-09-10
  • 打赏
  • 举报
回复
不能用函数与存储过程
吉普赛的歌 版主 2017-09-10
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('testTable') IS NOT NULL
DROP TABLE testTable
GO
CREATE TABLE testTable(id INT PRIMARY KEY,[name] NVARCHAR(20),parentId INT)
INSERT INTO testTable(id,[name],parentId) VALUES(1,'xf1',0)
INSERT INTO testTable(id,[name],parentId) VALUES(2,'xf2',0)
INSERT INTO testTable(id,[name],parentId) VALUES(3,'xf3',2)
INSERT INTO testTable(id,[name],parentId) VALUES(4,'xf4',3)
INSERT INTO testTable(id,[name],parentId) VALUES(5,'xf5',4)
INSERT INTO testTable(id,[name],parentId) VALUES(6,'xf6',5)

--1. 不用 with
DECLARE @t TABLE (id INT,[name] NVARCHAR(20),parentId INT)
INSERT INTO @t
SELECT * FROM testTable AS tt WHERE id=6
WHILE EXISTS(
SELECT 1 FROM testTable AS a INNER JOIN @t b ON a.id=b.parentId
AND a.id NOT IN (SELECT id FROM @t)
)
BEGIN
INSERT INTO @t
SELECT a.* FROM testTable AS a INNER JOIN @t b ON a.id=b.parentId
AND a.id NOT IN (SELECT id FROM @t)
END
SELECT * FROM @t

--2. 用 with
;WITH cte AS(
SELECT * FROM testTable WHERE id='6'
UNION ALL
SELECT a.* FROM testTable AS a INNER JOIN
cte ON a.id=cte.parentId
)
SELECT * FROM cte


  • 打赏
  • 举报
回复
with 递归很方便的
OwenZeng_DBA 2017-09-10
  • 打赏
  • 举报
回复
引用 楼主 boylafong 的回复:
表名 testtable id name ParentID 1 xf1 0 2 xf2 0 3 xf3 2 4 xf4 3 5 xf5 4 6 xf6 5 找到name为xf6的数据,而xf6的parentID一直往上等于ID的所有数据 希望得到的结果为 id name ParentID 2 xf2 0 3 xf3 2 4 xf4 3 5 xf5 4 6 xf6 5 注意:不要用with
为什么不要用with?
boylafong 2017-09-10
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
递归一般用cte来实现,如果是SQL、2000无法使用cte,一般是写个方法循环插入临时表实现; 如果楼主要求不用cte、函数、存储过程,那实现方式就是把循环插入的语句直接拿出来运行了。
循环插入的语句直接拿出来运行是什么意思? 我数据早就在一台机器生成好了,放那里 了,另外一台机器调用这些数据,我又提问了,可以的话麻烦去看下 http://bbs.csdn.net/topics/392260873
boylafong 2017-09-10
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
递归一般用cte来实现,如果是SQL、2000无法使用cte,一般是写个方法循环插入临时表实现; 如果楼主要求不用cte、函数、存储过程,那实现方式就是把循环插入的语句直接拿出来运行了。
用的是sqlite数据库,论坛里没有 sqlite不支持存储过程,不支持start with,人都要哭了
BlueStorm 2017-09-10
  • 打赏
  • 举报
回复
declare @TestTable table (id int, name char(3), ParentID int);
insert into @TestTable values
  (1, 'xf1', 0), (2, 'xf2', 0), (3, 'xf3', 2),
  (4, 'xf4', 3), (5, 'xf5', 4), (6, 'xf6', 5);

declare @ResultTable table (id int, name char(3), ParentID int);
declare @id int = null, @name char(3) ='xf6', @ParentID int;
select @id=id, @name=name, @ParentID=ParentID from @TestTable where name='xf6';
while @id is not null
begin
  insert into @ResultTable values (@id, @name, @ParentID);
  set @id = null;
  select @id=id, @name=name, @ParentID=ParentID from @TestTable where id=@ParentID;
end;

select * from @ResultTable order by id;

id          name ParentID
----------- ---- -----------
2           xf2  0
3           xf3  2
4           xf4  3
5           xf5  4
6           xf6  5
听雨停了 2017-09-09
  • 打赏
  • 举报
回复

--测试数据
IF OBJECT_ID('#tab') IS NOT NULL
DROP TABLE #tab
CREATE TABLE #tab(
id INT ,
NAME VARCHAR(20),
parentID INT	
)
INSERT INTO #tab
SELECT 1,'Xf1',0
UNION ALL
SELECT 2,'Xf2',0
UNION ALL
SELECT 3,'Xf3',2
UNION ALL
SELECT 4,'Xf4',3
UNION ALL
SELECT 5,'Xf5',4
UNION ALL
SELECT 6,'Xf6',5
UNION ALL
SELECT 7,'Xf7',6
--测试数据结束

SELECT a.* FROM #tab a
INNER JOIN #tab b ON a.id=b.parentID
WHERE b.parentID<=(SELECT parentID FROM #tab WHERE NAME='Xf6')
UNION
SELECT b.* FROM #tab a
INNER JOIN #tab b ON a.id=b.parentID
WHERE b.parentID<=(SELECT parentID FROM #tab WHERE NAME='Xf6')

id          NAME                 parentID
----------- -------------------- -----------
2           Xf2                  0
3           Xf3                  2
4           Xf4                  3
5           Xf5                  4
6           Xf6                  5

(5 行受影响)
上面是手机上回复的,看着太乱了重新用电脑给你整了下
听雨停了 2017-09-09
  • 打赏
  • 举报
回复
--测试数据IF OBJECT_ID('#tab') IS NOT NULLDROP TABLE #tabCREATE TABLE #tab(id INT ,NAME VARCHAR(20),parentID INT )INSERT INTO #tabSELECT 1,'Xf1',0UNION ALLSELECT 2,'Xf2',0UNION ALLSELECT 3,'Xf3',2UNION ALLSELECT 4,'Xf4',3UNION ALLSELECT 5,'Xf5',4UNION ALLSELECT 6,'Xf6',5UNION ALLSELECT 7,'Xf7',6--测试数据结束SELECT a.* FROM #tab aINNER JOIN #tab b ON a.id=b.parentIDWHERE b.parentID<=(SELECT parentID FROM #tab WHERE NAME='Xf6')UNIONSELECT b.* FROM #tab aINNER JOIN #tab b ON a.id=b.parentIDWHERE b.parentID<=(SELECT parentID FROM #tab WHERE NAME='Xf6')

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧