求树形结构数据自定义的递归查询?

时间:2022-02-25 00:28:17

数据就比如是Oracle里面的实例方案,employees表。

如果我要查询一个节点的所有祖先(上级)节点,自定义一个递归查询应该怎么写?因为考虑到以后要移植。

大家请不要给个Oracle数据库里帮实现的。因为考虑到移植。


Oracle里是这样写:
        select * from employees 
             start with employee_id=176 connect by prior manager_id=employee_id;

如果要按标准的SQL语法应该怎么实现?

14 个解决方案

#1


标准的sql没有这样的功能了,本来connect by就是Oracle的特性sql。

以前看到mysql里的方案是 用function做的。

#2


如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

 比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

比如TableA

id  pid  pathinfo
1        1
2    1   1,2
3    2   1,2,3
4    2   1,2,4
5    3   1,2,3,5

这里可以用类似
select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。

#3


引用 2 楼 inthirties 的回复:
如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

  比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

 比如TableA

 id  pid  pathinfo
 1        1
 2    1   1,2
 3    2   1,2,3
 4    2   1,2,4
 5    3   1,2,3,5

 这里可以用类似
 select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
 来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。


这样看来不能了,我表不是这样布的。
那我想用PL/SQL编一个方法,那应该怎么变呢???

#4


不知道表结构,想帮也没法帮啊啊~~~~

#5


引用 3 楼 kbzl251 的回复:
引用 2 楼 inthirties 的回复:
 如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

   比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

  比如TableA

  id  pid  pathinfo
  1        1
  2    1   1,2
  3    2   1,2,3
  4    2   1,2,4
  5    3   1,2,3,5

  这里可以用类似
  select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
  来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。




 这样看来不能了,我表不是这样布的。
 那我想用PL/SQL编一个方法,那应该怎么变呢???


那还不如用connect by来实现哟。

plsql怎么能跨数据库呀,

#6


引用 5 楼 inthirties 的回复:
引用 3 楼 kbzl251 的回复:
 引用 2 楼 inthirties 的回复:
  如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

    比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

   比如TableA

   id  pid  pathinfo
   1        1
   2    1   1,2
   3    2   1,2,3
   4    2   1,2,4
   5    3   1,2,3,5

   这里可以用类似
   select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
   来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。


  这样看来不能了,我表不是这样布的。
  那我想用PL/SQL编一个方法,那应该怎么变呢???


 那还不如用connect by来实现哟。

 plsql怎么能跨数据库呀,


如果我考虑到了跨平台,现在应该编写?  那只能在外面编写代码来吗?即编个Java代码。

#7


如果要跨数据库,那还不如用代码实现。
DB2与Oracle的存储过程就存在比较多的语法不同。

#8


怎么写,就看你的表设计了,如果是只有id和pid, 那么就递归的去拿。

我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的

#9


引用 7 楼 crazylaa 的回复:
如果要跨数据库,那还不如用代码实现。
 DB2与Oracle的存储过程就存在比较多的语法不同。


考虑以后效率问题。

#10


那也只能这样了。谢谢大家了,过点今天晚上结贴给你们加上分。

#11


引用 9 楼 kbzl251 的回复:
引用 7 楼 crazylaa 的回复:
 如果要跨数据库,那还不如用代码实现。
  DB2与Oracle的存储过程就存在比较多的语法不同。


 考虑以后效率问题。


呵呵,那你就每种数据库对应的写一个递归函数吧,只用标准sql去递归~~~

#12


今天晚上再没有更好的办法是,就结贴加分你们。谢谢大家

#13


引用 11 楼 crazylaa 的回复:
引用 9 楼 kbzl251 的回复:
 引用 7 楼 crazylaa 的回复:
  如果要跨数据库,那还不如用代码实现。
   DB2与Oracle的存储过程就存在比较多的语法不同。


  考虑以后效率问题。


 呵呵,那你就每种数据库对应的写一个递归函数吧,只用标准sql去递归~~~


标准SQL能写吗?我不懂写?请指教

#14


我的意思是你先用标准SQL实现一种数据库比如oracle的递归函数,然后再用db2的语法去改写这个函数。。。
要一个sql语句就实现这个功能,不依靠数据库的特性我没做过噢,不懂,可能比较难吧。

#1


标准的sql没有这样的功能了,本来connect by就是Oracle的特性sql。

以前看到mysql里的方案是 用function做的。

#2


如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

 比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

比如TableA

id  pid  pathinfo
1        1
2    1   1,2
3    2   1,2,3
4    2   1,2,4
5    3   1,2,3,5

这里可以用类似
select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。

#3


引用 2 楼 inthirties 的回复:
如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

  比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

 比如TableA

 id  pid  pathinfo
 1        1
 2    1   1,2
 3    2   1,2,3
 4    2   1,2,4
 5    3   1,2,3,5

 这里可以用类似
 select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
 来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。


这样看来不能了,我表不是这样布的。
那我想用PL/SQL编一个方法,那应该怎么变呢???

#4


不知道表结构,想帮也没法帮啊啊~~~~

#5


引用 3 楼 kbzl251 的回复:
引用 2 楼 inthirties 的回复:
 如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

   比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

  比如TableA

  id  pid  pathinfo
  1        1
  2    1   1,2
  3    2   1,2,3
  4    2   1,2,4
  5    3   1,2,3,5

  这里可以用类似
  select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
  来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。




 这样看来不能了,我表不是这样布的。
 那我想用PL/SQL编一个方法,那应该怎么变呢???


那还不如用connect by来实现哟。

plsql怎么能跨数据库呀,

#6


引用 5 楼 inthirties 的回复:
引用 3 楼 kbzl251 的回复:
 引用 2 楼 inthirties 的回复:
  如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。

    比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的

   比如TableA

   id  pid  pathinfo
   1        1
   2    1   1,2
   3    2   1,2,3
   4    2   1,2,4
   5    3   1,2,3,5

   这里可以用类似
   select a2.id from tablea a1, tablea a2 where instr(a1.pathinfo||',', a2.id||',', 1, 1) > 0
   来查到所有的父亲,不过这里instr也不是标准的sql,不同的数据库instr可能是不一样的名字。


  这样看来不能了,我表不是这样布的。
  那我想用PL/SQL编一个方法,那应该怎么变呢???


 那还不如用connect by来实现哟。

 plsql怎么能跨数据库呀,


如果我考虑到了跨平台,现在应该编写?  那只能在外面编写代码来吗?即编个Java代码。

#7


如果要跨数据库,那还不如用代码实现。
DB2与Oracle的存储过程就存在比较多的语法不同。

#8


怎么写,就看你的表设计了,如果是只有id和pid, 那么就递归的去拿。

我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的

#9


引用 7 楼 crazylaa 的回复:
如果要跨数据库,那还不如用代码实现。
 DB2与Oracle的存储过程就存在比较多的语法不同。


考虑以后效率问题。

#10


那也只能这样了。谢谢大家了,过点今天晚上结贴给你们加上分。

#11


引用 9 楼 kbzl251 的回复:
引用 7 楼 crazylaa 的回复:
 如果要跨数据库,那还不如用代码实现。
  DB2与Oracle的存储过程就存在比较多的语法不同。


 考虑以后效率问题。


呵呵,那你就每种数据库对应的写一个递归函数吧,只用标准sql去递归~~~

#12


今天晚上再没有更好的办法是,就结贴加分你们。谢谢大家

#13


引用 11 楼 crazylaa 的回复:
引用 9 楼 kbzl251 的回复:
 引用 7 楼 crazylaa 的回复:
  如果要跨数据库,那还不如用代码实现。
   DB2与Oracle的存储过程就存在比较多的语法不同。


  考虑以后效率问题。


 呵呵,那你就每种数据库对应的写一个递归函数吧,只用标准sql去递归~~~


标准SQL能写吗?我不懂写?请指教

#14


我的意思是你先用标准SQL实现一种数据库比如oracle的递归函数,然后再用db2的语法去改写这个函数。。。
要一个sql语句就实现这个功能,不依靠数据库的特性我没做过噢,不懂,可能比较难吧。