CET, 可以递归查询出所有记录,但是如何一层层迭代到底???

xdy3008 2010-03-31 03:50:13


Test data:

if object_id('region') is not null drop table [tb]
create table region([id] int,[col1] varchar(50),[col2] int)
insert region
select 0, 'China', NULL union all
select 1, 'HuBei Province', 0 union all
select 2, 'WuHan City', 1 union all
select 3, 'HuangGang City', 1 union all
select 4, 'HuangShi City', 1 union all
select 5, 'Wuchang Area', 2 union all
select 6, 'Macheng Area', 3 union all
select 7, 'XinZhou Area', 2 union all
select 8, 'HuangShi', 4 union all
select 9, 'HeNan Province', 0 union all
select 10, 'XinXiang City', 9 union all
select 11, 'aaa', 10 union all
select 12, 'bbb', 10

-- 以下查询所有记录,但是没有一层层的迭代到底
with tree(id,col1,col2,treeLevel) as(
select *, 0 from region where id = 0
union all
select a.*, treeLevel+1 from region a,tree where a.col2=tree.id
)
select * from tree

-- 期望得到下列结果, 按照Col1排序(如省份: 先遍历HeNan,然后把HeNan遍历到底, 再遍历HuBei, 然后把HuBei遍历到底),并且一层层查询到底再进行下次
(注意:按照下列顺序输出,我用Tab 只是为了好看显示用)

id Col1 Col2
0 China NULL
9 HeNan Province 0
10 XinXiang City 9
11 aaa 10
12 bbb 10
1 HuBei Province 0
3 HuangGang City 1
6 Macheng Area 3
4 HuangShi City 1
8 HuangShi 4
2 WuHan City 1
5 Wuchang Area 2
7 XinZhou Area 2

...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
feegle_develop 2010-03-31
  • 打赏
  • 举报
回复
UP
数据库群募集成员:31923373
htl258_Tony 2010-03-31
  • 打赏
  • 举报
回复
注意:OPTION(MAXRECURSION 4)用来设置递归时查找的层数,默认是100,如果超过默认或指定的,则会报错.通常我们用一个层数列来过滤指定的层.
xdy3008 2010-03-31
  • 打赏
  • 举报
回复
谢谢 fredrickhu

俺刚入手SQL 2005, 多多关照。
--小F-- 2010-03-31
  • 打赏
  • 举报
回复
--测试数据   深度排序     
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/
--小F-- 2010-03-31
  • 打赏
  • 举报
回复
这个属于广度深度排序..
bancxc 2010-03-31
  • 打赏
  • 举报
回复
你这个第一层便利到底了
第二层,第n层遍历到底了吗

34,590

社区成员

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

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