数据就比如是Oracle里面的实例方案,employees表。如果我要查询一个节点的所有祖先(上级)节点,自定义一个递归查询应该怎么写?因为考虑到以后要移植。大家请不要给个Oracle数据库里帮实现的。因为考虑到移植。
Oracle里是这样写:
        select * from employees 
             start with employee_id=176 connect by prior manager_id=employee_id;如果要按标准的SQL语法应该怎么实现?

解决方案 »

  1.   

    标准的sql没有这样的功能了,本来connect by就是Oracle的特性sql。以前看到mysql里的方案是 用function做的。
      

  2.   

    如果你的表设计的不错的话, 由孩子找所有的父记录也是可以做到的。 比如我们现在在表里的设计加上了一个pathinfo, 或者叫hierarchy的字段这个字段是表示这个节点的路径的比如TableAid  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.   


    那还不如用connect by来实现哟。plsql怎么能跨数据库呀,
      

  5.   


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

  6.   

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

  7.   

    怎么写,就看你的表设计了,如果是只有id和pid, 那么就递归的去拿。我们一起做这样的hierarchy的设计都会放一个pathinfo,或者hierarchy的信息进去的
      

  8.   


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

  9.   


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

  10.   

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