select
  decode(A_TYPE_ID,1,'A类型1',2,'A类型2'),
  decode(B_TYPE_ID,1,'B类型1',2,'B类型2'),
  decode(C_TYPE_ID,1,'C类型1',2,'C类型2')
from table_d

解决方案 »

  1.   

    如果类型表A,B,C数据量很大怎么版啊?不能一个一个decode吧?
      

  2.   

    --try:select d.SER_ID,a.type_name A_TYPE_NAME,b.type_name B_TYPE_NAME,c.type_name C_TYPE_NAME from 表D d,表A a,表B b,表C c 
    where d.A_TYPE_ID=a.type_id(+) and d.B_TYPE_ID=b.type_id(+) and d.C_TYPE_ID=c.type_id(+);
      

  3.   

    --前面的句子中有两个,用了全角字符。
    --改成下面的句子select d.SER_ID,a.type_name A_TYPE_NAME,b.type_name B_TYPE_NAME,c.type_name C_TYPE_NAME from 表D d,表A a,表B b,表C c 
    where d.A_TYPE_ID=a.type_id(+) and d.B_TYPE_ID=b.type_id(+) and d.C_TYPE_ID=c.type_id(+);
      

  4.   

    ORARichard(没钱的日子好难过啊) 的方法是可行的,就是不知道效率如何?我是菜鸟,随便说说
      

  5.   

    select d.SER_ID,
           nvl(t1.name,'') A_TYPE_NAME,
           nvl(t2.name,'') B_TYPE_NAME,
           nvl(t3.name,'') C_TYPE_NAME
    from d,
         (select name from a,d where d.A_TYPE_ID=a.type_id)  t1,
         (select name from b,d where d.A_TYPE_ID=b.type_id)  t2,
         (select name from c,d where d.A_TYPE_ID=c.type_id)  t3
      

  6.   

    to  h2dog(黄兴礼):你的这个语句,看看上面B为NULL,就选不出来了,不是我想要的结果啊.找到一个好的就揭帖了.
      

  7.   

    ORARichard(没钱的日子好难过啊):
    你给的那个显然不行啊,B的为NULL,
    and d.B_TYPE_ID=b.type_id这一句已经把
    那个Where给否定了啊.我想要的结果 明白说就是:
    那几个type的type_ID有可能为空,也有可能不空,
    如果为空,选出来的name也就为空,但是如果其他的
    type不是空,那么一定要把他选出来.现在只有 CodeMagic(ErrorDetector)
    的可以选出正确结果来.可是我就是担心万一表很大,decode的代码看起来自己都不舒服啊现在试了试
      

  8.   

    create table 表A (type_id int, type_name varchar2(100));
    create table 表B (type_id int, type_name varchar2(100));
    create table 表C (type_id int, type_name varchar2(100));
    create table 表D (SER_ID INT,A_TYPE_ID INT,B_TYPE_ID INT,C_TYPE_ID INT);insert into 表A select 1,'A类型1' from dual union select 2,'A类型2' from dual;
    insert into 表B select 1,'B类型1' from dual union select 2,'B类型2' from dual;
    insert into 表C select 1,'C类型1' from dual union select 2,'C类型2' from dual;
    insert into 表d select 1,1,null,1 from dual;SQL> select d.SER_ID,a.type_name A_TYPE_NAME,b.type_name B_TYPE_NAME,c.type_name C_TYPE_NAME from 表
    D d,表A a,表B b,表C c 
      2  where d.A_TYPE_ID=a.type_id(+) and d.B_TYPE_ID=b.type_id(+) and d.C_TYPE_ID=c.type_id(+);   SER_ID A_TYPE_NAME     B_TYPE_NAME     C_TYPE_NAME
    --------- --------------- --------------- ---------------
            1 A类型1                          C类型1这得到的不是楼主要的结果吗???
      

  9.   

    decode方法是不可取的,type_name是表中的数据,应该根据表中可能的数据通过sql获得,而不是在decode中写明,如果是写明,就不用在?_type表中分别保存了以下是我写的sql,执行效率没有测试
    select ser_id,
           nvl((select TYPE_NAME from A_TYPE where TYPE_ID=d.A_TYPE_ID),'') A_TYPE_NAME,
           nvl((select TYPE_NAME from B_TYPE where TYPE_ID=d.B_TYPE_ID),'') B_TYPE_NAME,
           nvl((select TYPE_NAME from C_TYPE where TYPE_ID=d.C_TYPE_ID),'') C_TYPE_NAME
      from D希望大家点评
      

  10.   

    ORARichard(没钱的日子好难过啊):
    你给的那个显然不行啊,B的为NULL,
    and d.B_TYPE_ID=b.type_id这一句已经把
    那个Where给否定了啊.
    ORARichard(没钱的日子好难过啊):
    的应该没错
    你没看到后面还有一个(+) 啊
    你的数据库是什么类型的??