select so_nbr,seq,decode(length(a.so_charge_type_id),3,id) "charge_id",decode(length(a.so_charge_type_id),5,id) "payment_type_id" 
from SO_CHARGE@db_dqyy a,
(
     select to_number(b.so_charge_type_id) so_charge_type_id,to_number(b.newid) id from query_charge_to_boss b 
     union all 
     select so_charge_type_id,charge_id from so_charge_cat_id_to_boss c
) b
where a.so_charge_type_id = b.so_charge_type_id(+)
order by 1,2;
麻烦  liusong_china  给解释解释可以吗? 谢谢···感激不尽!!!

解决方案 »

  1.   


        select to_number(b.so_charge_type_id) so_charge_type_id,to_number(b.newid) id from query_charge_to_boss b 
        union all 
        select so_charge_type_id,charge_id from so_charge_cat_id_to_boss c 
    ) b 
    这一段子查询是将你的两个中间表b,c组合成一个临时表,称之为b
      

  2.   

    然后是你的主表a和临时生成的表b通过so_charge_type_id连接,如果so_charge_type_id长度为3,就相当于和原先的c表连接产生charge_id字段;长度为5的时候产生payment_type_id
      

  3.   

    where a.so_charge_type_id = b.so_charge_type_id(+) 
    这是a与b通过so_charge_type_id 字段做左连接。
    左联时,会全显左表的数据,如果右表没有满足的条件的数据为null
      

  4.   

    又出了新问题刚刚你给的sql是分成两列,结果是
    ---------
    100501   
            1
            1应该是把那个  1 与100501 并列显示出来能给看看吗  liusong_china?
      

  5.   


    结果应是
    -----------------
    chage_id   payment_type_id
    100501         1
                   1这样显示
      

  6.   


    中间表b表和c表会有so_charge_type_id相同的数据吗?
      

  7.   


    不会
    b表的so_charge_type_id的长度一般都是5位  而c表的so_charge_type_id的长度是小于5位的只不过是把刚刚的payment_type_id的值往上提一下,-----------------
    charge_id   payment_id
    100501    
                   1
                   1改成
    ----------------------
    charge_id  payment_id
    100501          1
                    1
    这样,,,麻烦了·
      

  8.   

    你的so_nbr,seq是联合主键,那么最终的结果只可能是有一列不为空啊,怎么可能会并列显示呢。
      

  9.   

    有人跟我说 按 so_nbr分组
    你看呢?
      

  10.   

    a表有主键,一行数据只能和bc中的一个表去关联,那么最后的结果也只能是某一列不为空啊,怎么可能都不为空呢
      

  11.   

    select a.so_nbr,decode(length(a.so_charge_type_id), 3, id) "charge_id",
           decode(length(a.so_charge_type_id), 5, id) "payment_type_id"
    from SO_CHARGE@db_dqyy a,
           (select to_number(b.so_charge_type_id) so_charge_type_id,
                   to_number(newid) id
            from query_charge_to_boss b
            union all
            select c.so_charge_type_id, c.charge_id from so_charge_cat_id_to_boss c) b
     where a.so_charge_type_id = b.so_charge_type_id
     group by a.so_nbr;
    怎么会说表达式不对?
      

  12.   


    加了group by以后,decode的地方要加上max()函数的。。但是按so_nbr好像够呛能满足,不是很明白到底数据是怎么对应的试试吧