用户表:
        用户ID    用户名称  
          01       Mike
          02       Tom
          03       John权限分配表:
        用户ID   权限ID
          01       Q1
          01       Q2
          02       Q1
          02       Q3
          03       Q2
权限表:
        权限ID   权限名称
          Q1      权限1
          Q2      权限2
          Q3      权限3若想得到像下面这样的结果集,如何写SQL文 ?
     用户ID     用户     权限
      01        Mike     权限1,权限2
      02        Tom      权限1,权限3
      03        John     权限2

解决方案 »

  1.   

    先关联查询然后用wm_concat 来合并(10g以后才可以)create table u1(id varchar2(20),uname varchar2(20));
    insert into u1 values('01','mike');
    insert into u1 values('02','tom');
    insert into u1 values('03','john');create table t22(id varchar2(20),pid varchar2(20));
    insert into t22 values('01','Q1');
    insert into t22 values('01','Q2');
    insert into t22 values('02','Q1');
    insert into t22 values('02','Q3');
    insert into t22 values('03','Q2');create table pt (pid varchar2(20),pname varchar2(20));
    insert into pt values('Q1','权限1');
    insert into pt values('Q2','权限2');
    insert into pt values('Q3','权限3');SQL> set wrap off
    SQL> select id,uname,wm_concat(pname)
      2  from(
      3  select a.id,a.uname,c.pname
      4  from u1 a,t22 b,pt c
      5  where a.id=b.id
      6  and b.pid=c.pid)
      7  group by id,uname
      8  /ID                   UNAME                WM_CONCAT(PNAME)
    -------------------- -------------------- -------------------------
    01                   mike                 权限1,权限2
    02                   tom                  权限1,权限3
    03                   john                 权限2
      

  2.   

    select max(用户ID) 用户ID,max(用户) 用户ID,Substr(Max(Sys_Connect_By_Path(t.权限名称, ',')), 2) 权限 from
       (select a.用户ID,a.用户名称 用户,c.权限名称,row_number()over(partition by a.用户ID order by c.权限名称)rn from
         A inner join B on A.用户ID=B.用户ID
         inner join C on B.权限ID=C.权限ID)t
      start with rn=1
      connect by rn-1=prior rn and 用户ID=prior 用户ID
      group by 用户ID用户ID 用户ID 权限
    1 mike 权限1,权限2
    2 tom 权限1,权限3
    3 john 权限2
      

  3.   

    oracle10之后有一个函数能够实现将列转换成行还有就是表之间的关联到底是内联还是左关联、有关联的问题。