(一)
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 表示没有上游父河流)
类似得用递归查询,但不合适 ..
这是ArcGis 生成的数据库, 不能改结构的. 只希望有一条sql语句..
我觉得还是更改数据库结构吧,使用一个表多对多表示河流关系
如(一)的在表里是两条记录:
id Pid
6 4
6 5
试试下面的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
(1)我也赞成修改数据库结构,不过也就说说,因为修改数据库结构的后果估计非常严重。。。
(2)下面是我写的方法,就是需要多次查询数据库。你需要修改getPid()方法。
感谢漂亮的Java代码, 写的比较好,但我想要sql语句...
@mick100ey: SQL的我就不会了,不过有百度啊,这个链接很相似啊: 这里。或者百度关键词:SQL 递归
之前有做过这样的,只不过我做的只有两级的层次关系
SELECT * FROM a a1
INNER JOIN a a2 ON a2.pid LIKE '%'+convert(NVARCHAR(50), a1.id)+'%'
WHERE a2.id=9
你这个貌似有无限多层次。