两张表
Table EMP
emp_id number(10)
emp_name varchar2
dept_id number(10)
mgr_emp_id number(10)Table DEPT
dept_id number(10)
dept_name varchar2怎么才可以写一个SELECT语句来获取该组织等级的代表性。下面的例子表明,史密斯的手下就是琼斯,迈尔斯和约翰逊。约翰逊的手下是罗伯茨:史密斯
  琼斯
  迈尔斯
  约翰逊
       罗伯茨
怎么才能写成这种样式

解决方案 »

  1.   

    SQL> select ename from emp
      2  connect by mgr=prior empno
      3  start with mgr is null;ENAME
    ----------
    KING
    JONES
    SCOTT
    ADAMS
    FORD
    SMITH
    BLAKE
    ALLEN
    WARD
    MARTIN
    TURNERENAME
    ----------
    JAMES
    CLARK
    MILLER
      

  2.   

    select * from emp
    start with mgr_emp_id is null
    connect by  mgr_emp_id = prior emp_id;
      

  3.   

    不好意思,我没说清楚 是这种样式
    怎么才可以写一个SELECT语句来获取该组织等级的代表性。下面的例子表明,史密斯的手下就是琼斯,迈尔斯和约翰逊。约翰逊的手下是罗伯茨:史密斯
           琼斯
           迈尔斯
           约翰逊
                 罗伯茨
    上司和手下不在同一竖行
      

  4.   


    create or replace function mypad(str varchar2, len number) return varchar2 is
      ret varchar2(2000) := '';
    begin
      for i in 1..len loop
        ret := ret || str;
      end loop;
      return ret;
    end;col name format a30
    select empno,mgr,mypad('    ', level - 1) || ename "name" from scott.emp
    start with mgr is null
    connect by  mgr = prior empno;     EMPNO        MGR name                          
    ---------- ---------- ------------------------------
          7839            KING                          
          7566       7839     JONES                     
          7788       7566         SCOTT                 
          7876       7788             ADAMS             
          7902       7566         FORD                  
          7369       7902             SMITH             
          7698       7839     BLAKE                     
          7499       7698         ALLEN                 
          7521       7698         WARD                  
          7654       7698         MARTIN                
          7844       7698         TURNER                
          7900       7698         JAMES                 
          7782       7839     CLARK                     
          7934       7782         MILLER  
      

  5.   

    SQL> select empno,mgr,lpad( ename, length(ename)+level - 1,'  ')   "name" from scott.emp
      2  start with mgr is null
      3  connect by  mgr = prior empno;
     
    EMPNO   MGR name
    ----- ----- --------------------------------------------------------------------------------
     7839       KING
     7566  7839  JONES
     7788  7566   SCOTT
     7876  7788    ADAMS
     7902  7566   FORD
     7698  7839  BLAKE
     7499  7698   ALLEN
     7521  7698   WARD
     7654  7698   MARTIN
     7844  7698   TURNER
     7900  7698   JAMES
     7782  7839  CLARK
     7934  7782   MILLER
     
    13 rows selected
     
      

  6.   

    insert into emp values(1,'帅',1,0);
    insert into emp values(2,'车',2,1);
    insert into emp values(3,'马',2,1);
    insert into emp values(4,'炮',2,1);
    insert into emp values(5,'士',3,2);
    insert into emp values(6,'相',3,2);
    insert into emp values(7,'兵',3,2);
    ---------------------------------------
    insert into dept values (1,'作战中心');
    insert into dept values (2,'帅帐中');
    insert into dept values (3,'车部下');
    ---------------------------------------select e.emp_id,d.dept_name,lpad('          ', 2*level - 1)||e.emp_name as name
    from emp e,dept d where e.DEPT_ID=d.DEPT_ID
    start with e.emp_id=1 connect by prior e.emp_id=e.mgr_emp_id ;