有一个树状的菜单 里面是一级一级的部门单位 
有一个文本框是输入条件 比如 单位名称 条件 模糊查询
(这个很好办 like语句就可以了)
如果有满足条件的 则找到它的父结点 它的父节点有父结点 
就还要找到它的父节点的父结点  直到它的根结点
打个比方 简单的说:
假设你有一个表testTable
里面有2个字段 id,parentid 数据如下:
id               parentid
100                 a
101                 b
200                 b
300                 c
a                   s1
b                   s1
c                   s2
s1                  t
s2                  g
t                   root
g                   root
如果我的叶节点是100
那么经过我查询后就应该是
100  a  s1  t root
最容易想的方法是
select pid from testTable where id='100'
 然后判断  pid 是否是root
不是就继续
select pid from testTable where id='a'
直到  pid是root
这是个最笨的办法 
这还是一个叶节点 要是一组呢?
我怎么样查出一组中每个id的所有父节点
比如 :
select id from testTable where id like '%0%'各位大侠是否有好的优化的查询 方法!

解决方案 »

  1.   

    反向使用
    select id from testTable 
    start with id like '%0%'
    connect by id = PRIOR pid
      

  2.   

    SELECT ID, PID FROM testtable
    START WITH ID = 100
    CONNECT BY PRIOR ID = PID
      

  3.   

    谢谢 大家 
    因为oracle我不太熟
    (java web开发的跟数据库打交道肯定少不了
    能推荐几本oracle的好书不?网上我搜了半天
    都没见到)
    项目又要用到 所以才求助大家
    csdn上的高手 真的不少
    再次谢谢大家
    以后有问题还要向大家请教
      

  4.   

    今天上网看了看关于start with 的语法
    贴出来 给跟我一样遇到同样问题的人
    自从Since Oracle 9i 开始,就可以通过 SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 如下例所示:
    column path format a50
    select level,sys_connect_by_path(child,"/") path
    from hier
    start with parent is null
    connect by prior child = parent;LEVEL PATH 
    -------- --------------------------------------------
    1 /Asia
    2 /Asia/China
    3 /Asia/China/Beijing
    2 /Asia/Japan
    3 /Asia/Japan/Osaka
    3 /Asia/Japan/Tokyo
    1 /Australia
    2 /Australia/New South Wales
    3 /Australia/New South Wales/Sydney
    1 /Europe
    2 /Europe/United Kingdom
    3 /Europe/United Kingdom/England
    4 /Europe/United Kingdom/England/London
    1 /North America
    2 /North America/Canada
    3 /North America/Canada/Ontario
    4 /North America/Canada/Ontario/Ottawa
    4 /North America/Canada/Ontario/Toronto
    2 /North America/USA
    3 /North America/USA/California
    4 /North America/USA/California/Redwood Shores 在 Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。下给出了一个关于这个函数使用的例子:select connect_by_isleaf,sys_connect_by_path(child,"/") path
    from hier
    start with parent is null
    connect by prior child = parent;CONNECT_BY_ISLEAF PATH
    ---------------------------------- ------------
    0 /Asia
    0 /Asia/China
    1 /Asia/China/Beijing
    0 /Asia/Japan
    1 /Asia/Japan/Osaka
    1 /Asia/Japan/Tokyo
    0 /Australia
    0 /Australia/New South Wales
    1 /Australia/New South Wales/Sydney
    0 /Europe
    0 /Europe/United Kingdom
    0 /Europe/United Kingdom/England
    1 /Europe/United Kingdom/England/London
    0 /North America
    0 /North America/Canada
    0 /North America/Canada/Ontario
    1 /North America/Canada/Ontario/Ottawa
    1 /North America/Canada/Ontario/Toronto
    0 /North America/USA
    0 /North America/USA/California
    1 /North America/USA/California/Redwood Shores  在Oracle 10g 中还有一个新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回当前层的根节点。如下面的例子,我可以显示出层次结构表中当前行数据所对应的最高等级节点的内容。select connect_by_root child,sys_connect_by_path(child,"/") path
    from hier
    start with parent is null
    connect by prior child = parent;CONNECT_BY_ROOT PATH
    ------------------------------ -------- 
    Asia /Asia
    Asia /Asia/China
    Asia /Asia/China/Beijing
    Asia /Asia/Japan
    Asia /Asia/Japan/Osaka
    Asia /Asia/Japan/Tokyo
    Australia /Australia
    Australia /Australia/New South Wales
    Australia /Australia/New South Wales/Sydney
    Europe /Europe
    Europe /Europe/United Kingdom
    Europe /Europe/United Kingdom/England
    Europe /Europe/United Kingdom/England/London
    North America /North America
    North America /North America/Canada
    North America /North America/Canada/Ontario
    North America /North America/Canada/Ontario/Ottawa
    North America /North America/Canada/Ontario/Toronto
    North America /North America/USA
    North America /North America/USA/California
    North America /North America/USA/California/Redwood Shores 在Oracle 10g 之前的版本中,如果在你的树中出现了环状循环(如一个孩子节点引用一个父亲节点),Oracle 就会报出一个错误提示:“ ORA-01436: CONNECT BY loop in user data”。如果不删掉对父亲的引用就无法执行查询操作。而在 Oracle 10g 中,只要指定“NOCYCLE”就可以进行任意的查询操作。与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE, 如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。如下例所示: create table hier2
    (
    parent number,
    child number
    );insert into hier2 values(null,1);
    insert into hier2 values(1,2);
    insert into hier2 values(2,3);
    insert into hier2 values(3,1);select connect_by_iscycle,sys_connect_by_path(child,"/") path
    from hier2
    start with parent is null
    connect by nocycle prior child = parent;CONNECT_BY_ISCYCLE PATH
    ------------------ -------
    0 /1
    0 /1/2
    1 /1/2/3  转自:http://hi.baidu.com/ipeipei/blog/item/278887d6b6be972f07088ba1.html