HISTORY 表
ID               NUMBER(10)
USERID           NUMBER(10)
DECRIPTION       VARCHAR2(200)
ROLE             NUMBER(2)    可能值1,0ADMIN 表
ADMINID          NUMBER(10)
ADMINNAME        VARCHAR2(50)USER 表          
USERID           NUMBER(10)
USERNAME         VARCHAR2(50)要求:查询HISTORY表,根据ROLE选择显示ADMINNAME或者USERNAME(
HISTORY.USERID和ADMIN.ADMINID,USER.USERID关联)谢谢

解决方案 »

  1.   

    select id,userid,decode(role,1,(select ADMINNAME from ADMIN where ADMINID=HISTORY.userid),0,(select USERNAME from USER where USERID=HISTORY.userid)) NAME,DECRIPTION from HISTORY 
      

  2.   

    select id,a.userid,discription,decode(role,'1',b.adminname,'0',c.username) name
    from history a,admin b,user c
    where a.userid=b.adminid
    and a.userid=c.userid;
      

  3.   

    select id,userid,
        decode(role,1,b.ADMINNAME,0,c.USERNAME) NAME,
        DECRIPTION 
    from HISTORY a,ADMIN b,USER c
    and (a.role='1' and  b.ADMINID=a.userid)
    or  (a.role='0' and  c.USERID=a.userid)
    ----or---->
    select id,userid,
        decode(role,1,b.ADMINNAME,0,c.USERNAME) NAME,
        DECRIPTION 
    from HISTORY a,ADMIN b,USER c
    and (a.role='1' and  b.ADMINID(+)=a.userid)
    or  (a.role='0' and  c.USERID(+)=a.userid)
      

  4.   

    假设 role 为 0 显示 admin name
    假设 role 为 1 显示 user name SELECT A.ID,B.ADMINNAME
        FROM HISTORY A, ADMIN B
        WHERE A.ID = B.ADMINID AND A.ROLE = 0
    UNION
    SELECT C.ID,D.USERNAME
        FROM HISTORY C, USER D, ADMIN E
        WHERE C.ID = D.USERID AND C.ROLE = 1 AND (C.ID NOT IN E.ADMINID)没有执行过,没有建表(表达一下大意就可以了)有朋友和我说
    (C.ID NOT IN E.ADMINID)可以被下句代替,效率会高
    (C.ID = E.ADMINID(+) AND E.ADMINID IS NULL)如果不考虑在两个表中的ID可能有重复,上面的方法都很好
    就是用decode我用union是有人说在索引的情况下,union比or效率高关于效率,我没有试验过,有空试验