问下·  
select * from (select  rownum rn,s.startdt,s.enddt,  s.custid,cp.prodclasid,(select dictvaluea from dictionary d where cp.prodclasid=d.id)prodname,s.id,c.skjlbh, s.custname, s.custmaincode,scnameid,s.jfsk,
   (select dictvaluea  name from dictionary d where d.id=s.scnameid )scname, amount,invoicemoney,collectionmembid,ea.username collectionmembname,
   case when (select count(*) from collectionrecords d 
     where d.djbh = to_char(s.id))>0 then '1' else '0' end iscollection,
  djsj,machinenum,c.jssj,c.jlbh,c.cwzt
    ,
       (select sklx
          from SERVICECHARGEINFO_SKLB sk
         where s.skdept = sk.deptid) sklx,
       (select yhmc
          from SERVICECHARGEINFO_SKLB sk
         where s.skdept = sk.deptid) yhmc,
       (select yhzh
          from SERVICECHARGEINFO_SKLB sk
         where s.skdept = sk.deptid) yhzh
  
   from servicechargeinfo s 
    left join collectionrecords c on c.djbh=to_char(s.id)
     left join empmember  em on em.id=s.collectionmembid 
    left join eauser ea on ea.userid=em.userid 
     left join customer cm on cm.id=s.custid 
     left join customerproduct cp on cp.customerid=cm.id WHERE  iscancle =0
上面一段SQL语句· 
   
怎么根据then '1' else '0' end iscollection,中的0就执行后面的 (select sklx
          from SERVICECHARGEINFO_SKLB sk
         where s.skdept = sk.deptid) sklx,
       (select yhmc
          from SERVICECHARGEINFO_SKLB sk
         where s.skdept = sk.deptid) yhmc,
       (select yhzh
          from SERVICECHARGEINFO_SKLB sk
         where s.skdept = sk.deptid) yhzh如果是1就执行sklx,yhmc,yhzh不知道这样是否可以实现呢
selectDictionarySQL

解决方案 »

  1.   

    如果不是1,这三个字段打算放什么值?我觉得这地方没有必要纠结是否需要查询。
    可以直接全部查出来,在程序里面去判断iscollection,如果是1那么后面三个字段有效,否则直接忽视即可。
      

  2.   

    你好,我拆成3份就可以了,
    但是现在查询好慢啊,可否帮我优化一下下面这段代码
    select *
      from (select rownum rn,
                   s.startdt,
                   s.enddt,
                   s.custid,
                   cp.prodclasid,
                   (select dictvaluea
                      from dictionary d
                     where cp.prodclasid = d.id) prodname,
                   s.id,
                   c.skjlbh,
                   s.custname,
                   s.custmaincode,
                   scnameid,
                   s.jfsk,
                   (select dictvaluea name
                      from dictionary d
                     where d.id = s.scnameid) scname,
                   amount,
                   invoicemoney,
                   collectionmembid,
                   ea.username collectionmembname,
                   case
                     when c.jlbh is not null then
                      '1'
                     else
                      '0'
                   end iscollection,
                   djsj,
                   machinenum,
                   c.jssj,
                   c.jlbh,
                   c.cwzt,
                   case
                     when c.jlbh is not null then
                      c.sklx
                     else
                      sk.sklx
                   end sklx,
                   case
                     when c.jlbh is not null then
                      c.yhmc
                     else
                      sk.yhmc
                   end yhmc,
                   case
                     when c.jlbh is not null then
                      c.yhzh
                     else
                      sk.yhzh
                   end yhzh
              from servicechargeinfo s
              left join SERVICECHARGEINFO_SKLB sk
                on s.skdept = sk.deptid
              left join collectionrecords c
                on c.djbh = to_char(s.id)
              left join empmember em
                on em.id = s.collectionmembid
              left join eauser ea
                on ea.userid = em.userid
              left join customer cm
                on cm.id = s.custid
              left join customerproduct cp
                on cp.customerid = cm.id
             WHERE iscancle = 0
               and s.skdept = '001010'
               and to_char(s.id) not in
                   (select djbh from collectionrecords where djbh is not null)
               AND s.inputdt > to_date('2013-1-1', 'YYYY-MM-DD')
               and rownum <= to_number(20)
             order by s.inputdt desc)
     where rn > to_number('0')
     
      

  3.   

    可能是其中有表发生死锁了。单从上面的sql来看,你可以去掉那些to_number函数。有一点不理解,前面
    left join collectionrecords c
                on c.djbh = to_char(s.id)后面又有
    and to_char(s.id) not in
                   (select djbh from collectionrecords where djbh is not null)
    好像有点矛盾。