表t1(struct_id 主键)
struct_id  struct_name
1 1#
2 2#
3 3#
表t2(size_id主键,struct_id 外键关联表t1的struct_id)
size_id key# struct_id
1 11# 1
2 12# 1
3 13# 1
4 14# 1
5 15# 1
6 16# 2
7 17# 2
8 18# 2
9 19# 2
10 20# 2
表ccc
c_id  c_name
28     cc1
29     cc2
30     cc3
31      cc4
表t3(size_id参考表t2的主键,c_id参考ccc表的主键)
size_cid  value# size_id c_id
1 aa0 1 28
2 aa1 2 28
3 aa2 3 28
4 aa3 4 28
5 aa4 5 28
6 aa5 5 29
7 aa6 3 29
8 aa7 8 29
9 aa8 9 29
10 aa9 10 29
11 aa10 1 30
12 aa11 3 30
13 aa12 4 30
14 aa13 4 31
15 aa14 6 31
16 aa15 7 31 结果(比如查找struct_id=1的size_id,value#28等同于c_id=28,类推)
struct_id  struct_name size_id key# value#28 value#29 value#30 value#31
1                  1# 1 11# aa0 null aa10 null
1                  1# 2 12# aa1 null null null
1                  1# 3 13# aa2 aa6 aa11 null
1                  1# 4 14# aa3 null aa12 aa13
1                  1# 5 15# aa4 aa5 null null

解决方案 »

  1.   

    SQL> select t1.struct_id,t1.struct_name,t2.size_id,t2.key#,
      2  case when t3.size_id in(select size_id from t3 where c_id=28)
      3  then t3.value# else 'null' end as value#28,
      4  case when t3.size_id in(select size_id from t3 where c_id=29)
      5  then t3.value# else 'null' end as value#29 
      6  from t1,t2,t3
      7  where t1.struct_id=t2.struct_id
      8  and t2.size_id=t3.size_id
      9  and t1.struct_id=1; STRUCT_ID STRUCT_NAM    SIZE_ID KEY#       VALUE#28   VALUE#29
    ---------- ---------- ---------- ---------- ---------- ----------
             1 1#                  1 11#        aa0        null
             1 1#                  2 12#        aa1        null
             1 1#                  3 13#        null       aa2--以下为我表里的测试数据
    SQL> select * from t1; STRUCT_ID STRUCT_NAM
    ---------- ----------
             1 1#
             2 2#
             3 3#SQL> select * from t2;   SIZE_ID KEY#        STRUCT_ID
    ---------- ---------- ----------
             1 11#                 1
             2 12#                 1
             3 13#                 1
             4 14#                 2
             5 15#                 2
             6 16#                 2已选择6行。SQL> select * from t3;  SIZE_CID VALUE#        SIZE_ID       C_ID
    ---------- ---------- ---------- ----------
             1 aa0                 1         28
             2 aa1                 2         28
             3 aa2                 3         29
             4 aa3                 4         29SQL> select * from ccc;      C_ID C_NAME
    ---------- ----------
            28 cc1
            29 cc2
            30 cc3
            31 cc4
    --在语句里好像没用到ccc这张表
    另外 我的t3表里内容没你多 c_id只有28和29两条记录 所以我的查询结果只有#VALUE28和#VALUE29两列 没有你要求的#VALUE30和#VALUE31两列 你照样子给select再添加上两个case语句列就可以了
      

  2.   

    表结构没有复制错,后来我想了下需要利用笛卡尔积才可以或得结果,但还不是最终结果,
    --获取节点号为16的尺寸代号对应的车型(两种实现方法)①      
    select distinct sc.car_id from size_car sc where sc.size_id in (select si.size_id from sizes si where si.struct_id=16)
    select sc.car_id from sizes si,size_car sc where si.struct_id=16 and si.size_id = sc.size_id group by sc.car_id
    --利用笛卡尔积获取节点为16的尺寸代号以及车型组成的结构②
    select sii.struct_id,sii.size_id,sii.measure_size,sii.size_name,sii.note,sii.recommend_a,cid.car_id from sizes sii,
    (select sc.car_id from sizes si,size_car sc where si.struct_id=16 and si.size_id = sc.size_id group by sc.car_id) cid 
    where sii.struct_id = 16 order by cid.car_id,sii.size_id--根据②的结果和尺寸车型表size_car,获取最终结果select re2.*,re1.measure_value from size_car re1,(select sii.struct_id,sii.size_id,sii.measure_size,sii.size_name,sii.note,sii.recommend_a,cid.car_id from sizes sii,
    (select sc.car_id from sizes si,size_car sc where si.struct_id=16 and si.size_id = sc.size_id group by sc.car_id) cid 
    where sii.struct_id = 16 order by cid.car_id,sii.size_id) re2 
    where re1.size_id(+)= re2.size_id and re1.car_id(+)= re2.car_id order by re2.car_id,re2.size_id
    现在的结果是:
    struct_id size_id measure_size size_name note,recommend_a car_id measure_value 
    16 102 测量1 测量1 测量1 测量1 28 281
    16 103 测量2 测量2 测量2 测量2 28 282
    16 104 测量4 测量4 测量4 测量4 28 283
    16 105 测量5 测量5 测量5 测量5 28 284
    16 106 测量6 测量6 测量6 测量6 28 285
    16 102 测量1 测量1 测量1 测量1 29
    16 103 测量2 测量2 测量2 测量2 29 asdf
    16 104 测量4 测量4 测量4 测量4 29 asdf
    16 105 测量5 测量5 测量5 测量5 29 asdf
    16 106 测量6 测量6 测量6 测量6 29 asdf
    16 102 测量1 测量1 测量1 测量1 31
    16 103 测量2 测量2 测量2 测量2 31
    16 104 测量4 测量4 测量4 测量4 31
    16 105 测量5 测量5 测量5 测量5 31
    16 106 测量6 测量6 测量6 测量6 31 asdf
    16 102 测量1 测量1 测量1 测量1 32
    16 103 测量2 测量2 测量2 测量2 32 asdf
    16 104 测量4 测量4 测量4 测量4 32
    16 105 测量5 测量5 测量5 测量5 32
    16 106 测量6 测量6 测量6 测量6 32
      

  3.   

    最终结果是:
    aa bb  cc    dd   ee    ff     28   29    31    32 
    16 102 测量1 测量1 测量1 测量1   281  null  null  null
    16 103 测量2 测量2 测量2 测量2   282  asdf  null  asdf 
    16 104 测量4 测量4 测量4 测量4   283  asdf  null  null
    16 105 测量5 测量5 测量5 测量5   284  asdf  null  null
    16 106 测量6 测量6 测量6 测量6   285  asdf  asdf  null 
    也就是把上面的结果的前6列当成一个公共部分,第七列的值有28,29,31,32四个值,直接作为公共部分的右半部分的列,第七列的值依次对应最终的结果 
      

  4.   

    现在的问题变为了如何转表结构了
     示例:
    1  A1
    2  A2
    3  A3
    1  B1
    2  
    3  B3
    1  
    2  C2
    3  C3
    结果:
    1  A1  B1    null
    2  A2  null  C2
    3  A3  B3    C3
    这样就可以了,请问各位大侠如何实现啊 
      

  5.   

    --用过程吧,row_col 
    create or replace procedure row_col(
    v_cirsor out sys_refcursor
    ) is
    sqlstr varchar2(4000);
    cursor mycursor is select ', sum(decode(car_id,'||car_id||',measure_value,0))'||'"'||car_id||'" ' c2 from 表 group by car_id;
    r1 mycursor%rowtype;
    begin
      sqlstr :='select size_id ';
      open mycursor;
           loop
             fetch mycursor into r1;         
             exit when mycursor%notfound;
             sqlstr:=sqlstr || r1.c2;        
           end loop;
      close mycursor;
      sqlstr:=sqlstr||' from result3 group by size_id order by size_id ';
      open v_cirsor for sqlstr;
    end row_col;
    根据你的数据,做了下测试,这个可以实现。