表结构
create table branch
(
branchno      varchar2(16),                    --机构号
name          varchar2(64),                    --机构名称
levelid       integer,                     --机构级别(1,2,3,4)
parentbranchno     varchar2(16),                     --父机构号
primary key(branchno)
)查询结果
级别  机构名称  机构号   父机构
1     一级机构  9999
2     二级机构  1000   --它的父机构9999
3     三级机构  1100   --它的父机构时1000
3     三级机构  1200   --它的父机构时1000
4     四级机构  1210   --它的父机构时1200
2     二级机构  2000   --它的父机构9999
3     三级机构  2100   --它的父机构时2000
3     三级机构  2200   --它的父机构时2000请教各位大大,要得到这样的结果,sql语句怎么写?
谢谢,在线等

解决方案 »

  1.   


    select a.levelid ,a.name,a.branchno ,a.parentbranchno  from branch a,branch b
    where a.prantno(+)=b.no 你看看这句话对不?
      

  2.   

    select a.levelid ,a.name,a.branchno ,a.parentbranchno from branch a left join branch b on a.parentbranchno=b.branchno
      

  3.   

    select a.levelid ,a.name,a.branchno ,a.parentbranchno from branch a left join branch b on a.parentbranchno=b.branchno+---------+-------+----------+----------------+
    | levelid | name  | branchno | parentbranchno |
    +---------+-------+----------+----------------+
    |       1 | yiji  | 9999     | NULL           |
    |       2 | erji  | 1000     | 9999           |
    |       3 | sanji | 1100     | 1000           |
    |       3 | sanji | 1200     | 1000           |
    +---------+-------+----------+----------------+
      

  4.   

    查询结果好办,你的那个排序,只看看到如果是root在第1行,然后后面按机构号升序,用decode实现,注意一定要用to_number(null),否则可能顺序不对
    SQL> select * from t
      2  order by  decode(id,9999,to_number(null),id)  nulls first;
     
            ID
    ----------
          9999
          1000
          1100
          1200
          1210
          2000
          2100
          2200
     
    8 rows selected
    如果想要整个结果,那么把测试数据贴出来吧,不然还要自己根据你的结果拼测试数据比较烦
     
      

  5.   


    LEVELID NAME BRANCHNO PARENTBRANCHNO
    1 一级                    9999
    3 三级   3700    3400
    3 三级   5100    5199
    3 三级   2900            3400
    3 三级   2700            3400
    3 三级   3600            3400
    2  二级   3400            9999
    2 二级   5199            9999
    3 三级 0100    3400
    3 三级 0200    3400
    3 三级 0300             3400
    3 三级 0400     3400
    我查询出来像这样了,是不是因为9999机构的父机构这个字段没有值?
      

  6.   

    你这个mysql??
    oracle中任何不加order by的都无法保证顺序,要有序必须加order by
      

  7.   

    查看了结果,和select * from branch 查询出来的结果对比,顺序没有变化
      

  8.   

    是啊 ,排序字段比较好加啊 。这个是mysql,不过这个sql语句是通用的。
    select a.levelid ,a.name,a.branchno ,a.parentbranchno from branch a left join branch b on a.parentbranchno=b.branchno order by a.branchno 试试看 
    还有,你想怎么排序,大概描述下 。
      

  9.   


    LEVELID NAME BRANCHNO PARENTBRANCHNO
    1 一级 9999
    2 二级 5199 9999
    3 三级 5100 5199
    3 三级 3700 3400
    3 三级 3600 3400
    2 二级 3400 9999
    3 三级 2900 3400

    试了一下,得到的结果如上,5199机构的对了,3400机构的顺序不对
    我想要的结果像这样
    LEVELID NAME BRANCHNO PARENTBRANCHNO
    1 一级 9999
    2 二级 5199 9999
    3 三级 5100 5199
    2 二级 3400 9999
    3 三级 3700 3400
    3 三级 3600 3400
    3 三级 2900 3400

      

  10.   

    树形结构的问题吧
    树形结构:层次化查询,即树型结构查询,是SQL中经常用到的功能之一,通常由根节点,父节点,子节点,叶节点组成,其语法如下:       SELECT [LEVEL] ,column,expression,...       FROM table_name       [WHERE where_clause]       [[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];       SELECT levelid,name,branchno,parentbranchno
    FROM branch
    START WITH branchno = 9999
    CONNECT BY PRIOR branchno = parentbranchno
    ORDER BY levelid,name,branchno,parentbranchno
    更多:层次化查询(START BY ... CONNECT BY PRIOR)
      

  11.   


    看样子是需要oracle的树查询了,你上网看看,现在我这没测试环境
      

  12.   

    select levelid, name, branchno
      from branch
     start with  branchno=9999
    connect by  parentbranchno = prior branchno
      

  13.   

    测试数据
    select * from branch;
    9999 一级 1
    5199 二级 2 9999
    5100 三级 3 5199
    3400 二级 2 9999
    3700 三级 3 3400
    3600 三级 3 3400
    2900 三级 3 3400
    执行后的结果
    select  t.levelid,t.name,t.branchno,t.parentbranchno from branch t start with t.branchno='9999' connect by prior t.branchno=t.parentbranchno;
    1 一级 9999
    2 二级 5199 9999
    3 三级 5100 5199
    2 二级 3400 9999
    3 三级 3700 3400
    3 三级 3600 3400
    3 三级 2900 3400
    这个可以不?
    已上是oracle测试结果 
      

  14.   

    with tree as (
    select 9999 branchno, '一级机构A' name, 1 levelid, null parentbranchno from dual union all 
    select 1000 branchno, '二级机构A' name, 2 levelid, 9999 parentbranchno from dual union all 
    select 1100 branchno, '三级机构A' name, 3 levelid, 1000 parentbranchno from dual union all 
    select 1200 branchno, '三级机构B' name, 3 levelid, 1000 parentbranchno from dual union all 
    select 1210 branchno, '四级机构A' name, 4 levelid, 1200 parentbranchno from dual union all 
    select 2000 branchno, '二级机构B' name, 2 levelid, 9999 parentbranchno from dual union all 
    select 2100 branchno, '三级机构C' name, 3 levelid, 2000 parentbranchno from dual union all 
    select 2200 branchno, '三级机构D' name, 3 levelid, 2000 parentbranchno from dual
    )
    select levelid, name, branchno, parentbranchno
      from tree
     start with parentbranchno is null
    connect by prior branchno = parentbranchno