导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

请教一个查所有子节点的最顶层节点SQL写法

jxk 2017-08-21 09:02:39
输入数据如下:
id name parent_id level
1 '江苏省' 0 0
2 '南京市' 1 1
3 '玄武区' 2 2
4 '鼓楼区' 2 2
5 '浙江省' 0 0
6 '杭州市' 5 1
7 '西湖区' 6 2
8 '滨江区' 6 2
9 '苏州市' 1 1
10 '吴中区' 9 2
11 '吴江区' 9 2

查出所有节点的最顶层节点
id name parent_id level top_parent_id
1 '江苏省' 0 0 0
2 '南京市' 1 1 1
3 '玄武区' 2 2 1
4 '鼓楼区' 2 2 1
5 '浙江省' 0 0 0
6 '杭州市' 5 1 5
7 '西湖区' 6 2 5
8 '滨江区' 6 2 5
9 '苏州市' 1 1 1
10 '吴中区' 9 2 1
11 '吴江区' 9 2 1

请帮忙看下这个SQL该怎么写,多谢!
...全文
163 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
QQ961132897 2017-08-22
我看不懂我慢慢看
回复
吉普赛的歌 版主 2017-08-21
引用 2 楼 kyo1979 的回复:
top_parent_id 这一列是要SQL计算出来的
还是不明白你意思, 如果讲顶级, 那就是:
select * from 表 where parent_id=0
按你的数据, 基本省级就是顶级了, 有些级的顶级不是省级是怎么个意思?
回复
二月十六 2017-08-21
用cte来做递归查询实现,代码如下:
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[name] nvarchar(23),[parent_id] int,[level] int)
Insert #T
select 1,N'江苏省',0,0 union all
select 2,N'南京市',1,1 union all
select 3,N'玄武区',2,2 union all
select 4,N'鼓楼区',2,2 union all
select 5,N'浙江省',0,0 union all
select 6,N'杭州市',5,1 union all
select 7,N'西湖区',6,2 union all
select 8,N'滨江区',6,2 union all
select 9,N'苏州市',1,1 union all
select 10,N'吴中区',9,2 union all
select 11,N'吴江区',9,2
Go
--测试数据结束
;WITH cte AS (
SELECT * ,
parent_id AS top_parent_id ,
id AS child_parent_id
FROM #T
WHERE parent_id = 0
UNION ALL
SELECT #T.* ,
cte.child_parent_id AS top_parent_id ,
cte.child_parent_id
FROM #T
JOIN cte ON cte.id = #T.parent_id
)
SELECT id ,
name ,
cte.parent_id ,
cte.level ,
cte.top_parent_id
FROM cte
ORDER BY cte.id;


回复
jxk 2017-08-21
top_parent_id 这一列是要SQL计算出来的
回复
吉普赛的歌 版主 2017-08-21
select * from 表 where top_parent_id=0
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告