select substr(sta.changetime, 0, 8) as riqi,sta.orderid
,(select p.facelistid from print_facelist p where p.orderid = sta.orderid) as faceid
,(select customername from customerinfo c where c.customerid =
      (select customerid from ordersinfo o where o.orderid = sta.orderid
                   and o.customerid = c.customerid) and rownum = 1) as customername
,(select ordersum from ordersinfo o where o.orderid = sta.orderid) as ordersum
  from orderstatuhisinfo sta
 where 1 = 1
   and sta.lststatu = '14'
   and TO_DATE(SUBSTR(CHANGETIME, 0, 14), 'yyyymmddhh24miss') BETWEEN
       TO_DATE('2009-01-01 16:01:09', 'yyyy-mm-dd hh24:mi:ss') AND
       TO_DATE('2009-08-29 16:01:09', 'yyyy-mm-dd hh24:mi:ss')
   and exists (select 'x'
          from ordersinfo ord
         where ord.orderid = sta.orderid
           and ord.expresstype = '0')

解决方案 »

  1.   

    楼主你的sql嵌套的太多了,为啥不用连接查询呢
      

  2.   

    select distinct 
           substr(sta.changetime, 0, 8) as riqi
         , sta.orderid
         , p.facelistid
         , c.customername
         , o.ordersum
    from   orderstatuhisinfo sta 
         , print_facelist p
         , customerinfo c
         , ordersinfo o  
    where  sta.orderid      = o.orderid 
    and    sta.orderid      = p.orderid 
    and    o.customerid     = c.customerid 
    and    TO_DATE(SUBSTR(CHANGETIME, 0, 14), 'yyyymmddhh24miss') 
           BETWEEN TO_DATE('2009-01-01 16:01:09', 'yyyy-mm-dd hh24:mi:ss') 
           AND     TO_DATE('2009-08-29 16:01:09', 'yyyy-mm-dd hh24:mi:ss') 
    and    sta.lststatu     = '14' 
    and    o.expresstype    = '0'表数据量不大的话试试这个,感觉customerinfo和ordersinfo是两个大表。sql优化的话下次记得把每个表的索引和表中数据量列出来
      

  3.   

    TO_DATE(SUBSTR(CHANGETIME, 0, 14)不要对你的字段进行函数操作,这一块地方的查询条件改成字段串比较
      

  4.   

    customerinfo和ordersinfod这两个大表确实数据量很大,一个是客户信息表,一个是订单信息表,这两个表每天都有几万条数据添加
      

  5.   

    另外问一句,数据量肯定是非常大的,有几十万条,写这样的SQL是用连接快呢,还是嵌套快?
      

  6.   

    几十万条不算大了,用连接试试另外from后面表的顺序要换一下,按照数据量大小依次排列还有紧跟where后面的第一个条件最好用到最大表的一个索引另外,还可以在select后面使用hint,如
    select /*+ parallel(sta,8) ordered use_hash(c,o) */