问一个sql的写法

cxjacky 2011-02-16 04:43:25
现在有个数据库表 有如下几列 id(int),parentid(int),name(char)

其中parentid指向表中其他行 存储父节点的id,表示这两行数据之间的父子关系,如果parentid为null 表示他是根节点

怎样构造一个sql语句能够得到某行数据 从它一直到根节点的name值呢?
比如有
id parentid name
1 null a
2 1 b
3 1 c
4 2 d

那对于id 为1 就是 a
id为2 就是 a/b
id为3 就是 a/c
id为4 就是 a/b/d

多谢!
...全文
90 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huabbb123 2011-04-13
  • 打赏
  • 举报
回复
这是种递归的算法,对parentid通过用游标去实现递归去连接name,当parentid为空时,就可以能过游标反回结果。还是不太明的话可以看看关于游标的应用
jjoe2007 2011-03-04
  • 打赏
  • 举报
回复
oracle可以这样查

table aa
cz_id,cz_name,cz_parent_id

Select Sys_Connect_By_Path(Cz_Name, '/'), Sys_Connect_By_Path(Cz_Id, '/')
From aa z
Start With z.Cz_Id = 子ID
Connect By Prior z.Cz_Parent_Id = z.Cz_Id

查询出来的结果:

/Beijing /336
/Beijing/China /336/227
/Beijing/China/China Region /336/227/100
/Beijing/China/China Region/HUAWEI /336/227/100/99

看你想要那一层,

baidurenjwt 2011-02-19
  • 打赏
  • 举报
回复
一共有几层啊?

你可以从最后开始往前查找。先把parentid is null 的找出来,然后以这个结果集为主表,使用左连接往前推,一共有几层就使用几次。
zyujie 2011-02-17
  • 打赏
  • 举报
回复
楼主,可以用with去递归,,sql server 2005以上...

with T as
(
select A.id,A.pid,A.name from tb as A where id = 4
union all select B.id,B.pid,B.name from tb as B
inner join T on T.pid=B.id
)
select * from T order by id asc
horizonlyhw 2011-02-17
  • 打赏
  • 举报
回复
start with connect by
cxjacky 2011-02-16
  • 打赏
  • 举报
回复
自己顶一下!

6,108

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 数据库报表
社区管理员
  • 数据库报表社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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