假设t1表有多个字段,t2表有2个字段,并且这2个字段t1表中也有,那么请问一下2个sql有什么区别呢,因为查出来的数据完全不一样,差别很大select * from t1 a where not exists
(select 1 from t2 b where b.field1 = a.field1 and b.field2 = a.field2)和
select * from t1 a where not exists (select * from t2);
有什么区别啊

解决方案 »

  1.   

    ................ 
     where b.field1 = a.field1 and b.field2 = a.field2
     差别就在条件上。。 
    完全不一样的2个语句怎么可能 没有差别呢 
      

  2.   

    因为t2表里只有2个字段
    而且每一行数据都存在在t1表中
    我的意思就是从t1表中去掉t2表中的所有数据
    有什么不对啊
    和第一条sql应该是一样的啊
      

  3.   

    (1)select * from t1 a where not exists
       (select 1 from t2 b where b.field1 = a.field1 and b.field2 = a.field2)和
    (2)select * from t1 a where not exists (select * from t2);解释:
    第一条语句选出的是在t1表中但是不在t2表中的所有数据;
    第二条语句选出的是t1表中的所有数据。因为只要t2 表不为空,条件not exists (select * from t2)就永远为真,因此就会选出t1表中的所有数据。
      

  4.   

    我建了2个表
    t1表为
    terminal_id   boss_set  service_id
    1             a         b
    2             aa        bb
    3             aaa       bbb
    4             aaaa      bbbbt2表为
    terminal_id   boss_set  
    1             a         
    2             aa        
    3             aaa      
    我用
    select * from t1 a where not exists (select * from t2 b where a.terminal_id = b.terminal_id2 and a.boss_set = b.boss_set2);
    查出来的是
    4   aaaa    bbbb用select * from t1 a where not exists (select * from t2 b);查出来的是空,没有值我就是不懂原因何在,我的t1表包含t2表中的数据,我第二条sql的意思难道不是去除t1表中的t2表的数据吗
      

  5.   

    已经很清楚了exists只判断子查询里是否有>=1行的记录,如果是就为真,
    很明显,t2表的有三条记录,所以exists恒为真,而not exists恒为假,所以查不出记录第二个语句要写成not in就是你的意思了
    SELECT * FROM t1 a WHERE (terminal_id, boss_set) NOT IN (SELECT terminal_id, boss_set FROM t2 b);
      

  6.   

    原因可以按照如下分析
    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
    --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
    --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
    --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据NOT EXISTS 恰好相反
      

  7.   

    那select * from t1 a where not exists
    (select 1 from t2 b where b.terminal_id = a.terminal_id and b.boss_set = a.boss_set)
    返回值是
    4   aaaa   bbbb这个sql语句exists中的字句也恒为真啊,那它怎么返回值跟之前那条不一样呢,为什么关联了外表之后就是对外表进行了筛选,而不是判断exists字句中的值恒为真或者恒为假呢,返回值也不是空了
      

  8.   


    这个解释是错的.exists 一般只能用于关联查询,就是说在第一种情况下,是可以这样做的.
    第二个,不支持这样的语法,如果要用到第二种这样的情况,只能用NOT IN 
      

  9.   

    select * from t1 a where not exists
    (select 1 from t2 b where b.terminal_id = a.terminal_id and b.boss_set = a.boss_set)楼主了解关联子查询执行的顺序吗
    上面这个语句的执行是这样的t1表为
    terminal_id boss_set service_id
    1 a b
    2 aa bb
    3 aaa bbb
    4 aaaa bbbbt2表为
    terminal_id boss_set  
    1 a  
    2 aa  
    3 aaa 从t1表中选出记录1 a b,拿去到t2表中查找满足条件where b.terminal_id = a.terminal_id and b.boss_set = a.boss_set的记录,结果当然是存在,因此括号里的子查询返回1,而因为是not exists,外层的where就返回为false,因此不会选出t1表中的记录1 a b。
    而对于4 aaaa bbbb这条记录,同样的道理,楼主自己想一想吧。
      

  10.   

    用exists时,exists字句中要有表1的某个条件,然后才能select 表1