有表结构和数据如下,ID表示工号,TYPE表示名字类型,NAME则记录名字
TYPE为0,表示NAME中的名字为中文,1则为英文
行号    id      type      name
1 1 0 王海
2 1 1 jon
3 2 0 小李
4 3 1 happy先希望通过最简单的SQL语句来查询得到结果如下
行号     ID       CNAME    ENAME
1 1 王海 jon
2 2 小李
3 3 happy一下是我自己写的SQL,但是总觉得效率有问题,请大家帮忙出出主意select distinct t.id,t1.cname,t2.ename from test_table t,
(select id,name as cname from test_table where type = 0) t1,
(select id,name as ename from test_table where type = 1) t2
 where t.id = t1.id(+) and t.id = t2.id(+)
 order by t.id

解决方案 »

  1.   

    select 
    id,
    max(decode(type,0,name,'')) cname,
    max(decode(type,1,name,'')) ename
    from tb
    group by id
      

  2.   

    测试范例CREATE TABLE AA(RNUM NUMBER, ID NUMBER, TYPE NUMBER, NAME VARCHAR2(20));INSERT INTO AA VALUES(1, 1, 0, '王海');
    INSERT INTO AA VALUES(2, 1, 1, 'jon');
    INSERT INTO AA VALUES(3, 2, 0, '小李');
    INSERT INTO AA VALUES(4, 3, 1, 'happy');SELECT  ROWNUM, ID, DECODE(TYPE, 0, NAME) AS NAME,
                DECODE(SEC_NAME, NULL, DECODE(TYPE, 1, NAME, SEC_NAME), 
                                       SEC_NAME) AS CNAME
    FROM (
    SELECT ID, TYPE, NAME, 
           LEAD(NAME, 1, NULL) OVER (PARTITION BY ID ORDER BY TYPE) AS SEC_NAME,
           ROW_NUMBER() OVER  (PARTITION BY ID ORDER BY TYPE) AS SEQ
    FROM   AA
          )
    WHERE SEQ = 1
      

  3.   

    这张表有问题,为什么不多加一个字段!!!
    基于当前表,你试试下面的SQL:
    SELECT distinct t.id, t.name as cname, t1.name as ename 
    FROM test_table t LEFT JOIN test_table t1 on t.id=t1.id and t1.type=1
    WHERE t.type = 0 
    ORDER BY t.id
      

  4.   

    TO : footpath(footpath)  你的方式不对,查的结果有问题,没有考虑到中文名字没有的情况TO : DragonBill(用户中文昵称------静观其变,以静制动) 您的方式我还没有试,但是貌似效率上要比jiazheng(飛天) 稍微差一些
      

  5.   

    :),to jiazheng(飛天) 的语句,在这个例子里实际不可以不需要group by,效率会更高select 
    id,
    decode(type,0,name,'') cname,
    decode(type,1,name,'') ename
    from tb
      

  6.   

    To: bjt_(bjt)   但是没有MAX怎么做到我需要的答案呢?不用的话,会变成4行数据,这个不是我想要的
      

  7.   

    to:bjt_(bjt) ( ) 
    不group by 好像不行吧