有三张表
学生表
  ID  NAME
   1  张三 
   2  李四教师表
  ID  NAME
   1  张老师
   2  李老师
汇总表
ID   TNAME   TID    
 1   学生表   2
 2   教师表   1
现在用一条SQL结果要得:
 ID  TNAME  NAME
  1  学生表 李四
  2  教师表 张老师
用这样是可以实现:
SELECT ID,TNAME,
       DECODE(TNAME,
             '学生表',
             (Select Name from 学生表 Where ID = TID)
             '教师表',
             (Select Name from 教师表 Where ID = TID) ) NAME
FROM 汇总表
 
但是这样太麻烦了,因为现实中的数据是非常多的
请大家帮忙想想,有什么好方法吗?谢谢大家了!

解决方案 »

  1.   

    to yuyu1980:  要怎么改表结构?to Paladin_china:  详细一点好吗?谢谢
      

  2.   

    比如说: 你可以写个存储过程declare
    @v_str varchar2(20); 
    @sql varchar2(100);
    @sql :='select 0 from dual';
    begin
    foreach @v_str in (select tname from 汇总表) loop
    @sql :=@sql||'union all SELECT id,tname,(select name from'||@v_str||' where tid=id) name FROM 汇总表';
    end loop;
    execute immediate @sql;
    end;大概就这样做,我由于没有测试一下,请见谅,大概就这个思路!
      

  3.   

    SELECT /*+ USE_HASH(a b c) */
      ID,
      TNAME,
      b.name || c.name as  NAME
    FROM 汇总表 a
    left outer join 学生表 b
    on ( a.TID = b.ID )
    left outer join 教师表 c
    on ( a.TID = c.ID )
      

  4.   

    楼上的方法可行但跟这样不是一样的SELECT ID,TNAME,DECODE(A.TNAME,学生表,(SELECT NAME FROM 学生表 WHERE ID = A.TID),
                           教师表,(SELECT NAME FROM 教师表 WHERE ID = A.TID)) AS NAME 
    FROM 汇总表 a如果表越来越多,那SQL语句就会越来越长啊
      

  5.   

    我只是讲讲思路,存储过程有些foreach循环语句语法,我也忘了.如果有错的地方,就是foreach那个循环写错了.
      

  6.   

    还有 @sql声明的varchar2()可能个数太小了,你可以 改成varchar2(500)或更大.
      

  7.   

    SELECT 
      ID,
      TNAME,
      decode(TNAME,'学生表',b.name ,c.name) as  NAME
    FROM 汇总表 a,学生表 b,教师表 c
    where a.TID = b.ID(+)
    and a.TID = c.ID (+)