如何优化not inselect s_splpacketcode from JC_B_Packet
where 
s_splpacketcode not in 
(
select p.s_splpacketcode from JC_B_Packet p,jc_m_repairdata t
where p.s_splpacketcode = t.s_taskcode
and t.i_factrunmile != -1
and t.c_taskstate = '04'
and t.s_trainsetid = 'kind001'
)
group by s_splpacketcode
order by s_splpacketcode

解决方案 »

  1.   

    not in->not exists
    我只知道这样了....
      

  2.   


    select s_splpacketcode
      from JC_B_Packet
     where s_splpacketcode not in
           (select p.s_splpacketcode
              from JC_B_Packet p, jc_m_repairdata t
             where p.s_splpacketcode = t.s_taskcode
               and t.i_factrunmile != -1
               and t.c_taskstate = '04'
               and t.s_trainsetid = 'kind001')
    --group by s_splpacketcode  去掉此行即可。
     order by s_splpacketcode;
      

  3.   

    select s_splpacketcode from JC_B_Packet t1
    where not exists (select 1  from JC_B_Packet p,jc_m_repairdata t
    where p.s_splpacketcode = t.s_taskcode
    and t.i_factrunmile != -1
    and t.c_taskstate = '04'
    and t.s_trainsetid = 'kind001'
    and p.s_splpacketcode = t1.s_splpacketcode)
    order by s_splpacketcode
      

  4.   

    用not exists~~!要比not in 好些!!!
      

  5.   


    不一定的,光键还是看oracle选择了什么执行计划。所以,楼主请把执行计划帖出来
      

  6.   

    select s_splpacketcode from JC_B_Packet 
    minus

    select p.s_splpacketcode from JC_B_Packet p,jc_m_repairdata t 
    where p.s_splpacketcode = t.s_taskcode 
    and t.i_factrunmile != -1 
    and t.c_taskstate = '04' 
    and t.s_trainsetid = 'kind001' 

    order by s_splpacketcode
      

  7.   

    select p.s_splpacketcode 
    from JC_B_Packet p
    where s_splpacketcode not exists 
    (select 1 from jc_m_repairdata t 
    where p.s_splpacketcode = t.s_taskcode and t.i_factrunmile != -1 and t.c_taskstate = '04' and t.s_trainsetid = 'kind001' 

    --group by p.s_splpacketcode  没有必要要这一句,因为没有聚合函数
    order by p.s_splpacketcode
      

  8.   

    加group by 是相当于distinct吧,过滤重复值
      

  9.   

    大部分时候是no exists比not in快不少
      

  10.   

    如果单纯过滤重复 distinct 比group by 要快点
      

  11.   

    --试试看下面的SQL:
    SELECT S_SPLPACKETCODE
      FROM JC_B_PACKET
    MINUS (SELECT P.S_SPLPACKETCODE
             FROM JC_B_PACKET P, JC_M_REPAIRDATA T
            WHERE P.S_SPLPACKETCODE = T.S_TASKCODE
              AND T.I_FACTRUNMILE != -1
              AND T.C_TASKSTATE = '04'
              AND T.S_TRAINSETID = 'kind001')
     ORDER BY 1;
      

  12.   

    如果子记录集少,建议使用not in,反之,如果子记录集多,建议使用not exists
      

  13.   

    反正我用not exists比not in快..
      

  14.   

    改为用left join的方式试试...
      

  15.   

    这个回答准确,不要盲目的使用NOT EXISTS
      

  16.   


    --楼主也不反馈些信息。去掉group by 后,若避免s_splpacketcode重复,可以使用distinct。select distinct s_splpacketcode
      from JC_B_Packet
     where s_splpacketcode not in
           (select p.s_splpacketcode
              from JC_B_Packet p, jc_m_repairdata t
             where p.s_splpacketcode = t.s_taskcode
               and t.i_factrunmile != -1
               and t.c_taskstate = '04'
               and t.s_trainsetid = 'kind001')
     order by s_splpacketcode;