首页 新闻 会员 周边

sql 逗号分割怎么查父级?

0
悬赏园豆:10 [待解决问题]
(一)
id Pid
6 4,5
(二) id Pid
9 6,7,8

像这种结构怎么查询父级呢? 

情景: 如上图, 6的父结点 有 2个 , 9 的父结点有 3个, 

        表示的意思是: id 4,5的2条河 流入了 id 6的河, id 6,7,8 的河 最后流入了 id 9的河

问题:怎么通过当前id 查询父级所有id? 返回所有父级id 表格.

   例如: 怎么找到id 为9的所有上游河流ID? (Pid 为-1 表示没有上游父河流)

   类似得用递归查询,但不合适 ..

 

sql
问题补充:

这是ArcGis 生成的数据库, 不能改结构的. 只希望有一条sql语句..

mick100ey的主页 mick100ey | 初学一级 | 园豆:75
提问于:2014-04-15 18:30
< >
分享
所有回答(3)
0

我觉得还是更改数据库结构吧,使用一个表多对多表示河流关系

如(一)的在表里是两条记录:

id  Pid

6  4

6  5

诶碧司 | 园豆:1912 (小虾三级) | 2014-04-15 18:37

试试下面的sql,用来查询id=9的所有父级。其中的tt为原来的表名

这是SQL Server支持的递归查询

with tb
as
(
select *
from tt where id=9
union all
select a.*
from tt a
     inner join tb b on (b.pid like '%,'+CONVERT(varchar(50), a.id) or b.pid like CONVERT(varchar(50), a.id)+',%' or b.pid like '%,'+CONVERT(varchar(50), a.id)+',%' or b.pid=CONVERT(varchar(50), a.id))
)
select *
from tb
where id<>9

 

支持(0) 反对(0) 诶碧司 | 园豆:1912 (小虾三级) | 2014-04-16 16:29
0

(1)我也赞成修改数据库结构,不过也就说说,因为修改数据库结构的后果估计非常严重。。。

(2)下面是我写的方法,就是需要多次查询数据库。你需要修改getPid()方法。

View Code
ThreeTree | 园豆:1490 (小虾三级) | 2014-04-15 21:02

感谢漂亮的Java代码, 写的比较好,但我想要sql语句...

支持(0) 反对(0) mick100ey | 园豆:75 (初学一级) | 2014-04-16 05:00

@mick100ey: SQL的我就不会了,不过有百度啊,这个链接很相似啊: 这里。或者百度关键词:SQL 递归

支持(0) 反对(0) ThreeTree | 园豆:1490 (小虾三级) | 2014-04-16 12:13
0

之前有做过这样的,只不过我做的只有两级的层次关系

SELECT * FROM a a1
INNER JOIN a a2 ON a2.pid LIKE '%'+convert(NVARCHAR(50), a1.id)+'%'
WHERE a2.id=9

你这个貌似有无限多层次。

水晶途途 | 园豆:1443 (小虾三级) | 2014-04-16 14:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册