数据就比如是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做的。
以前看到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可能是不一样的名字。
比如我们现在在表里的设计加上了一个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
这样看来不能了,我表不是这样布的。
那我想用PL/SQL编一个方法,那应该怎么变呢???
#4
不知道表结构,想帮也没法帮啊啊~~~~
#5
那还不如用connect by来实现哟。
plsql怎么能跨数据库呀,
#6
如果我考虑到了跨平台,现在应该编写? 那只能在外面编写代码来吗?即编个Java代码。
#7
如果要跨数据库,那还不如用代码实现。
DB2与Oracle的存储过程就存在比较多的语法不同。
DB2与Oracle的存储过程就存在比较多的语法不同。
#8
怎么写,就看你的表设计了,如果是只有id和pid, 那么就递归的去拿。
我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的
我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的
#9
考虑以后效率问题。
#10
那也只能这样了。谢谢大家了,过点今天晚上结贴给你们加上分。
#11
呵呵,那你就每种数据库对应的写一个递归函数吧,只用标准sql去递归~~~
#12
今天晚上再没有更好的办法是,就结贴加分你们。谢谢大家
#13
标准SQL能写吗?我不懂写?请指教
#14
我的意思是你先用标准SQL实现一种数据库比如oracle的递归函数,然后再用db2的语法去改写这个函数。。。
要一个sql语句就实现这个功能,不依靠数据库的特性我没做过噢,不懂,可能比较难吧。
要一个sql语句就实现这个功能,不依靠数据库的特性我没做过噢,不懂,可能比较难吧。
#1
标准的sql没有这样的功能了,本来connect by就是Oracle的特性sql。
以前看到mysql里的方案是 用function做的。
以前看到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可能是不一样的名字。
比如我们现在在表里的设计加上了一个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
这样看来不能了,我表不是这样布的。
那我想用PL/SQL编一个方法,那应该怎么变呢???
#4
不知道表结构,想帮也没法帮啊啊~~~~
#5
那还不如用connect by来实现哟。
plsql怎么能跨数据库呀,
#6
如果我考虑到了跨平台,现在应该编写? 那只能在外面编写代码来吗?即编个Java代码。
#7
如果要跨数据库,那还不如用代码实现。
DB2与Oracle的存储过程就存在比较多的语法不同。
DB2与Oracle的存储过程就存在比较多的语法不同。
#8
怎么写,就看你的表设计了,如果是只有id和pid, 那么就递归的去拿。
我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的
我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的
#9
考虑以后效率问题。
#10
那也只能这样了。谢谢大家了,过点今天晚上结贴给你们加上分。
#11
呵呵,那你就每种数据库对应的写一个递归函数吧,只用标准sql去递归~~~
#12
今天晚上再没有更好的办法是,就结贴加分你们。谢谢大家
#13
标准SQL能写吗?我不懂写?请指教
#14
我的意思是你先用标准SQL实现一种数据库比如oracle的递归函数,然后再用db2的语法去改写这个函数。。。
要一个sql语句就实现这个功能,不依靠数据库的特性我没做过噢,不懂,可能比较难吧。
要一个sql语句就实现这个功能,不依靠数据库的特性我没做过噢,不懂,可能比较难吧。