Exist是用于判断某个值是否在表中存在的最节省资源的方法。
如果用select判断某个值是否存在,它会返回符合条件的所有记录,试想一下,如果该值在表中出现的次数很多,比如100000条记录,那么将会占用大量的网络资源。
但exist在遇到第一条符合的记录就返回值了。

解决方案 »

  1.   

    说不清楚。总之第二个 exists 是第一个 select 语句的条件。仅当 a.opflag='001' 且 (select * from  cnttrunlog b where ...) 返回结果为空时第一个 exists 才为真。
      

  2.   

    这条语句我时候看懂了,可是逻辑有一点不明白,
    如果满足Bz = 'R' and a.OpFlag = '001'似乎肯定就不能满足select * from CntTurnLog b
    where b.OpFlag = 't01',要后面一个判断干什么?
    同意liuchen对Exist的看法,以前我喜欢用select count(*) 来判断是否有重复记录,后来也改用了Exist方法。
      

  3.   

    可以这样理解:所有 Bz = 'R' 的记录中,如果有 OpFlag = '001' 的记录、且没有 OpFlag = 't01' 的记录,整个表达式为真。
      

  4.   

    我的理解是
    当 “ OpFlag='001' 并且 Bz=‘R’ 且 在b表中所有的Bz='R'时,OpFlag<>'t01'的a表存在记录时,表达式为真
      

  5.   

    yangzi, a表b表都是表CntTurnLog。
      

  6.   

    不好意思,我看错了,
    nono兄,你的理解不太好懂,我看这样解释是不是好一些:
    当a 表中所有的Bz="R"的记录中,符合以下条件的时,表达式为真:
        1,存在OpFlag='001';
        2,不存在OpFlag="t01"。
      

  7.   

    这句话的意思是用exists来判断exists中的select语句所选择的数据集是否存在(第一个exists),而第二个exists则是判断条件,整句话的意思是:(从里往外)
      首先选择出满足b.OpFlag = 't01'和 b.BZ = a.Bz 的数据集A,然后再从CntTurnLog中选择满足a.Bz = 'R' and a.OpFlag = '001'和不存在于数据集A的数据集B, 最后存在数据集B则会返回True,否则false.三少 :o)
                    
                    
      

  8.   

    首先我说明!bz应该是一个可重复的字段!不然这样写没有意思!
    它应该是:选出这样的记录:在CntTurnLog表中Bz = 'R' 、OpFlag = '001'、opflag<>'t01'的记录
    这个语句的功能在于比较快!其实和
     select *
                from CntTurnLog a
                where a.Bz = 'R' 
                    and a.OpFlag = '001' and a.opflag<>'t01'是一样的
    不信可以实验以下!
      

  9.   

    yangzi, 你的解释比我说的清楚.
    wwl007, 你说的不对吧? a.OpFlag = '001' and a.opflag<>'t01'   这样的条件的后一半是没意义的. 呵呵
      

  10.   

    其实上面那条SQL语句,我是说从select开始以后的部分如果执行的话,结果应该是这样的,如果在所有的Bz='R'的记录中,如果满足我上面说的条件1,2,那么返回所有Bz='R'且OpFlag='001'的记录。如果不满足条件2,那么即使存在Bz='R'且OpFlag='001'的记录,那该select语句也返回NULL
      

  11.   

    wwl兄,你应该好好想一下,你就会发现你犯了一个极简单的错误,看一下我上面的解释,如果存在不满足我所说的条件2的话,你的SQL语句有错的。