各位大哥,小弟刚开始学习数据库,最近在学习的时候遇到个数据库SQL的问题,不知道该怎么写这句SQL,想上来向各位请教一下,先说一下问题:
有一张表 假设表名叫(table1),其中列和数据如下:name | title | parent|   
-----------------------
A      一级      --
B      二级      A
C      二级      A
D      一级      --
E      三级      B
F      三级      C
G      二级      D
H      三级      B
现在要查询出如下样式的结果,不知道该怎么写SQL
-------------------------------------------
A      B      E
A      B      H
A      C      F
D      G      ---------------------------------------------
不知道各位能看明白我的意思么,昨天问了一下人,他们说要用到什么递归,
我还是不大明白,希望各位能够帮忙看一下,顺便给点意见,谢谢.
还有我是用的sybase数据库.

解决方案 »

  1.   

    呵呵,不好意思,可能我没表达清楚题目意思
    就是查询出:一级标题对应的所有子标题并依次列出来
    比如一级标题A 他对应有二级标题B和C, 然后B对应有三级标题E,C对应有三级标题F
    一级标题D对应有二级标题G,并且G没有三级标题了
    那么查询数据中就是
    A    B    E
    A    C    F 
    D    G    -
      

  2.   

    看明白了,就是不知道LZ会有几个parent,如果最多只有3层的话,可以嵌套3次查询。(傻办法,,如果多的话.......)仅供参考:
    select t3.name1,t3,name2,t4,name as name3 
    (       select t1.name as name1 , t1.title as title1, t1.parent as parent1,t2.name as name2,t2.title as title2 
    from (select name title parent from table1
    where parent ='--' ) as t1 left join table1 as t2 
    on (t1.name=t2.parent and t2.parent<>'--') ) as t3 left join table as t4 
    on (t3.name2 = t4.name and t4.parent<>'--' and t3.name1<>t4.name)
      

  3.   


    LZ是嵌套写的sql么?你查出的结果什么地方不对?
    把你的sql贴出来看看
      

  4.   

    嵌套查询就可以,如果是oracle数据库的话,可以用 start with connect by 做递归查询
      

  5.   

    典型的SQL递归查询   不清楚你用的什么数据库  
    你百度下 SQL递归查询  就可以找到答案 
      

  6.   

    如果确定只有三层,硬编码就ok了。
    parent = --为条件
    然后
    left outer join table as level2
    ...
    left outer join table as level3
    ...
    大体应该是这样:
    select ..
    from table as level1
    left join table as level2
    on level1.name = level2.parent
    left join table as level3
    on level2.name = level3.parent
    where level1.parent = --
    如果不只三层的话,那就看你的数据库是否支持递归的join了。
    如果不支持递归查询,你可以试试hibernate,做一个递归的对应关系,然后就好办了。
      

  7.   

    select * from Table t start with t.子菜单=‘A’ connect by prior t.子菜单=t.父菜单  递归查询
      

  8.   

    各位大哥谢谢你们,可能是我吧问题没说清楚,我看好多热心的大哥的SQl语句中直接把"一级","二级"都做了条件,这样写好像不满足我现在的要求.我再把数据给大家说一下,呵呵,还是希望能得到各位热心帮助:呵呵,就像楼上一位大哥说的那样,我做测试的东西就是一个树形结构,在这个树形结构中最多有三级节点,
    第一级节点没有父节点,那么他的parent的值就是null,其他的二三级节点就一次类推;(其中有些节点只有二层,就是说没有三级节点)其实表中用到的字段就2个,一个是name ,一个是parent,且name和parent中数据是有关联关系的,name        |     parent
    -------------------------
    parm              null       --->这个是个一级节点
    commonParm        parm       --->这个是个二级节点
    coinParm          commonParm --->这个是个三级节点
    rateParm          commonParm
    bankParm          commonParm
    report            null
    singleFundReport  report
    manyFundReport    report
    thing             singleFundRepor
    attemper          singleFundRepor
    balanceTab        manyFundReport
    balanceChange     manyFundReport
    trade             null
    businessbalance   trade          
    workDateparm      trade      
    --------------------------------
    那个根据上面的数据查询出来的结果就是
    列一   |  列二       |    列三
    ---------------------------------
    para   commonParm         coinParm
    para   commonParm         rateParm
    para   commonParm         bankParm
    report singleFundReport   thing
    report singleFundReport   attemper
    report manyFundReport     balanceTab
    report manyFundReport     balanceChange
    trade  businessbalance    
    trade  workDateparm