分析一下此SQL如何写才能高效一点?
有个问题是这样的:在主表(ca_siw)当中,有个派发地市字段(send_city),它的字段值是这样的:  1/2/3/4/12/13
另外还有:reply_time:要求回复时限字段其中数字来源于地市公司的area_id字段, 它属于表rms_area,
主表ca_siw当中的send_city就是要派发到哪几个地市去,1/2/3/4/12/13是rms_area表中area_id的字段组合.派发了单子后,要进行回单处理.回单处理记入了表cap_siw当中
这个表中记录了回单时间:commit_time,回单人地市:areaId现在要求统计:已回复地市,未回复的地市,超时回复地市,未超时回复地市列表
这个SQL该如何写?

解决方案 »

  1.   

    什么意思来着?
    1/2/3/4/12/13这是send_city字段的值?
    每个对应一个area_id?
    要送往这么多个城市吗
      

  2.   

    不明白
    按这么说,一个单发往好几个城市,那么commit_time里记录的是哪个城市的回单时间
      

  3.   

    感觉表设计的不是很好,这里可以用一个子表来存send_city的,按现在的设计,要实现你这个功能只能用procedure,通过procedure来parser这个/得到send city然后procedure里查询出结果。
      

  4.   

    send_city这个字段很不合理
    select a.city_id,b.area_name from(
    select substr('/'||send_city,instr('/'||send_city,'/',1,rownum)+1,
      instr('/'||send_city||'/','/',1,rownum+1)-instr('/'||send_city,'/',1,rownum)-1)city_id,
      reply_time
    from ca_siw
    connect by rownum<=length(send_city)-length(replace(send_city,'/',''))+1)a,
    rms_area b,cap_siw c
    --后面的条件
    --及时回复的城市
    --where a.city_id=b.area_id and a.city_id=c.area_id
    --and a.reply_time>=c.commit_time
    --超时回复的城市
    --where a.city_id=b.area_id and a.city_id=c.area_id
     -- and a.reply_time<c.commit_time
    --未回复的城市
     --where a.city_id=b.area_id and a.city_id=c.area_id(+)
      -- and c.area_id is null
      

  5.   

    commit_time,里记录每个城市的回单时间
    这个表有个字段,记录area_id,user_id,commit_time
    ,表明某个地市的某个人什么时间回单.如果设子表楼上的该如何设置?一个主单关联多个send_city吗?
      

  6.   

    send_city用单号代替
    添加一个单号与城市代码的关系表
      

  7.   

    create table CA_SIW
    (
      SERVICE_ID                NUMBER not null,
      CUSTOMER_ID               VARCHAR2(50),
      CUSTOMER_NAME             VARCHAR2(300), 
      SEND_CITY             VARCHAR2(300),
      REPLY_TIME DATE
    )
    insert into ca_siw values(1,'0001','1/2/3/4/12','2009-09-01 15:01:01')create table CAP_SIW_FLOW
    (
      PROJECT_ID      NUMBER not null,
      LINK            VARCHAR2(64),
      EXECUTE_ID      NUMBER,
      AREA_ID NUMBER not null,
      COMMIT_DATE     DATE,
      NEXT_ID         VARCHAR2(500),  
       ACTION          VARCHAR2(128)
    )
    insert into ca_siw_flow values(1,'回单',85,1,'2009-09-01 13:01:01',86,'完成')
    insert into ca_siw_flow values(1,'回单',100,2,'2009-09-01 13:01:09',86,'完成')
    insert into ca_siw_flow values(1,'回单',200,3,'2009-09-01 16:11:01',86,'完成')表cap_siw_flow中的project_id字段的值是表ca_siw表中的service_id的值,ca_siw与cap_siw_flow是一对多.
    上面的数据是指service_id字段值为1的记录,被回单.它要求1/2/3/4/12这5个地市公司进行回单,AREA_ID字段是回单地市编号.在cap_siw_flow表中已经有1,2,3三个地市进行了回单.,commit_date是回单时间
    因此目前未回复的地市就是编号为12的值
    已经回复的地市就是1,2,3,4这四个
    超时回复的为:3
      

  8.   

    这样的表设计,已经制约了这个功能的性能,所以性能优化,不仅仅是实现的时候需要考虑的,设计时的一个优秀的考虑会给性能带来很大的提高这里的这个字段的设计,是瓶颈了,用procedure自己去解析,去取结果集了。这是能挽回性能的唯一做法