我有这一样问题向大家请教如题比如如下情况:
表Form_A中有A,B,C,D四条记录。
通过对一些字段的匹配我可以知道需要更新A,D两条记录,更新后需要把B,C两条记录删除。
其实就是要把整个表更新,但是不允许在更新操作前先把已有的记录全部删除后,再添加新的记录请问这种情况下,我怎样能知道B,C两条是没更新的数据,进而删除它们。我只能想到一种笨办法。就是把库中现在的所有记录保存到本地(只保存能起到唯一标识作用的字段),在更新数据库之前,对需要更新的数据和这个副本做匹配,能匹配的删掉,不能匹配的也就是需要删除的,即上面假定情况中的B,C两条记录。然后以这个“删除列表”为依据将数据库中相应的记录删除,最后做更新操作。
这种办法无论是对数据库还是对本地内存都增加了很多操作,实在不好用。不知道有没有SQL语句能直接查出没有被更新的数据或是更巧妙的办法。多谢多谢!!!

解决方案 »

  1.   

    更新的时候不是有个匹配条件吗,写个delete语句将不符合的删除掉不就好了?
      

  2.   

    delete from form_a a
    where not exists(select * from form_b where id=a.id)
      

  3.   

    not exists。或者更简单的,比如原条件是a=b and c=d and e=f,不符合就改成not(a=b) or not(c=d) or not (e=f)
      

  4.   

    delete from tbl a
    where not exists(select * from tbl where 用来更新的那些条件)
      

  5.   

    如果用上面各位朋友说的办法,还是有个疑问我每次只能通过条件找到一条需要更新的记当,并不能能通过条件一次就把表中记录分成“需要更新”和“不需要更新”两个子集。
    也就是说,先通过条件确定记录A需要更新,更新后如果用not exists不是把B,C,D都删掉了吗?
      

  6.   

    我的意思是这样,还是用最开始提到的假定情况:
    能确定表中每条记录的字段是:Name, Id
    本地有两组变量用来查找需要更新的字段:Name_A, Id_A, Name_D, Id_D用Name_A, Id_A找到记录A,更新,用Name_D, Id_D找到记录D更新
    现在要做的是找到B,C两条记录然后删除,如果用not exists的话,给出的条件是不是应该还是Name_A, Id_A, Name_D, Id_D呢?只能先全部更新或者先全部删除吧?如果更新记录后,用not exists加Name_A, Id_A两个条件来删掉其它的记录,这样做不是把除A以外的所有记录都删掉了吗?在做删除操作时,如果记录非常多,用not exists时是不是同样要给出非常多的条件呢?
      

  7.   

    1、给你的表加一个字段如: update_flag varchar(1)
    2、每次先更新 update_flag = ' ';
    3、在执行你的匹配更新操做,匹配成功的设定 update_flag = '1',
       这样 update_flag = '1' 的就是匹配上的数据
            update_flag = ' ' 的就是没匹配上的数据,应当删掉的数据
      

  8.   

    本地有两组变量用来查找需要更新的字段:Name_A, Id_A, Name_D, Id_D用Name_A, Id_A找到记录A,更新,用Name_D, Id_D找到记录D更新 这两句没看懂,修改表结构大抵是没必要的
      

  9.   

    是我没说明白
    Name_A, Id_A, Name_D, Id_D 是在更新操作时匹配字段用的。比如这样用ADO,
    UPDATA Form_A SET someOne1 = :v1, someOne2 = :v2 WHERE Name = :v3 AND Id = :v4
    v3, v4就用Name_A, Id_A或者Name_D, Id_D代替了not exists是不是应该这样用呢:
    delete from Form_A
    where not exists(select * from Form_A where Name = Name_A AND Id = Id_A)如果是这样的话,是不是把记录A以外的所有记录都删了?