各位大哥,小弟刚开始学习数据库,最近在学习的时候遇到个数据库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.   

    各位大侠,虽然我不大懂,但是好像普通的SQL语句数据库基本上是差不多的吧,这和具体的数据库关系好象不是很大吧,呵呵...
      

  2.   

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

  3.   

    用关系数据库分层?小的程序用XML吧
      

  4.   

    你的数据库我不会,mssql可以这样:--> 测试数据: ##t1
    if object_id('tempdb.dbo.##t1') is not null drop table ##t1
    create table ##t1 (name varchar(1),title varchar(4),parent varchar(1))
    insert into ##t1
    select 'A','一级',null union all
    select 'B','二级','A' union all
    select 'C','二级','A' union all
    select 'D','一级',null union all
    select 'E','三级','B' union all
    select 'F','三级','C' union all
    select 'G','二级','D' union all
    select 'H','三级','B'
    select * from ##t1--查询
    select a.name ,b.name,c.name
    from ##t1 a
    inner join ##t1 b on a.name=b.parent and a.title='一级'
    left join ##t1 c on b.name=c.parent and b.title='二级'
    /*
    结果
    name name name
    ---- ---- ----
    A    B    E
    A    B    H
    A    C    F
    D    G    NULL(4 行受影响)
    */
      

  5.   

    if exists(select * from sysobjects where [name]='table1')
    drop table table1
    go
    create table table1
    (
    [name] varchar(10),
    title varchar(10),
    parent varchar(10)
    )
    go
    insert into table1([name],title,parent)
    values('A','一级','--')
    insert into table1([name],title,parent)
    values('B','二级','A')
    insert into table1([name],title,parent)
    values('C','二级','A')
    insert into table1([name],title,parent)
    values('D','一级','--')
    insert into table1([name],title,parent)
    values('E','三级','B')
    insert into table1([name],title,parent)
    values('F','三级','C')
    insert into table1([name],title,parent)
    values('G','二级','D')
    insert into table1([name],title,parent)
    values('H','三级','B')
    go
    select a.name '一级',b.name '二级',isnull(c.name,'--') '三级' from table1 a inner join 
    table1 b on a.name=b.parent and a.title='一级'
    left join table1 c on b.name=c.parent and b.title='二级'
    go
      

  6.   

    各位大哥谢谢你们,可能是我吧问题没说清楚,我看好多热心的大哥的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