sql = "begin " 
                + "delete mtgSelectedContactext where siteid = ? and confid=? and uuid in"
                + "(select uuid from mtgSelectedContact where siteID = ? AND confID = ?"
                + "end;";
这是一条SQL语句。
       形式 delete Table where column in(select * from Table where ...), 
       当子查询结果集超过1024条可能会出现潜在的问题,不知这里该怎么修改,
       好像可以写个procedure,可是我不太会,不知哪位大虾可以指点指点?
       先谢谢了:)

解决方案 »

  1.   


    可以使用下面的SQL:
    ------------------delete mtgSelectedContactext 
     where siteid = ? 
       and confid=? 
       and exists(
         select 1 
           from mtgSelectedContact 
           where siteID = ? 
             AND confID = ?
             and uuid = mtgSelectedContactext.uuid
       )
      

  2.   

    看字段名称,
    mtgSelectedContactext表的siteid 和 confid好像和
    mtgSelectedContact  表的 siteid 和 confid是等于关系,如果这样
    可以这样写:
    -----------------------------------
    delete mtgSelectedContactext  
     where exists( 
         select 1  
           from mtgSelectedContact  
           where siteID = mtgSelectedContactext.siteID 
             AND confID = mtgSelectedContactext.confID 
             and uuid = mtgSelectedContactext.uuid 
       )在siteID ,confID ,uuid 创建Index。
      

  3.   

    exists好像性能比较下降,特别是当数据多的时候,佩服ehuman的眼力,mtgSelectedContactext表的siteid 和 confid和mtgSelectedContact  表的 siteid 和 confid是等于关系;
    这样不知怎么样?
    -----------------------------------
    delete mtgSelectedContact 
       where uuid 
       between 
           (select min(uuid) from mtgSelectedContact where siteid=? and confid=? and usertype=?)
       and 
           (select max(uuid) from mtgSelectedContact where siteid=? and confid=? and usertype=?)
      

  4.   

    回复ehuman3楼的帖子:
    SQL不能那样写,那样写的话就把所有相同的siteid and confid都删除了,传过来的siteid and confid就没有意义了,right?
      

  5.   


    exists也看什么情况,如果Index正确的了,绝对比In快,
    不过Oralce网站上也有说明,在特定环境下,in比exists快。
    我就遇到这个问题,exists需要10分钟,in 50秒就可以,
    主要是嵌套表内数据命中率比较低。如果可以提供执行计划,这样才能找到真正原因。
      

  6.   

    在siteID ,confID 创建复合Index可能更有效