and xxxx = all(子查询)如果子查询是个空集 这个条件返回的结果是true 为什么? 如果是 xxxx <> all(子查询) 子查询是空集 返回true还可以理解不用解释实现原理 基本可以猜的出来 只是不明白为什么是这个逻辑 

解决方案 »

  1.   

    这个我原来在SQL SERVER2005写的一个SQL见过 我也想过这个问题
    where 后面条件=空的时候SQL SERVER2005他就是能出来值我当时用的是动态参数
    我也不是很理解
      

  2.   

    子查询是NULL,返回结果应该是NULL,不可能是TRUE
      

  3.   

    lz用的就有问题吧。
    要使用=,就要保证子查询确定有1个数据;不然,就使用in而不是=。
      

  4.   

    Oracle中的NULL代表的是无意义,或者没有值。
    下面请看真值表:
           |AND NULL  |OR NULL 
    TRUE  |NULL      |TRUE 子查询中如果用 in/exists 类似于 OR NULL
                 not in/not exists 类似于 AND NULL
      

  5.   

    楼主最好把代码贴出来看看 这样会更清楚些SQL> select * from t3;
     
            ID NAME
    ---------- --------------------
             1 a
             2 b
             3 c
    SQL> select * from t3 where id = all(select 1 from dual);
     
            ID NAME
    ---------- --------------------
             1 a
     
    SQL> select * from t3 where id = all(select null from dual);  --我试了一下 好像没出现你所说的情况
     
            ID NAME
    ---------- --------------------
     
      

  6.   

    在子查询中
    Any表示若表达式与子查询的结果之一满足比较关系,则搜索条件的值为真,若子查询的结果为无值,搜索条件的值为假。
    Some与any的含义完全相同,可相互替换。
    All表示若表达式与子查询返回的全部值都满足比较关系,则搜索条件的值为真,若子查询的结果为无值,搜索条件的值为真。
    SQL> select * from test;NAME                                MONEY TIME
    ------------------------------ ---------- --------------
    张三                                  100 01-1月 -09
    李四                                   70 01-1月 -09
    张三                                  140 01-2月 -09
    张三                                  120 01-3月 -09SQL> SELECT * FROM test t WHERE t.money = ALL (SELECT 1 FROM dual WHERE 1 = 2);NAME                                MONEY TIME
    ------------------------------ ---------- --------------
    张三                                  100 01-1月 -09
    李四                                   70 01-1月 -09
    张三                                  140 01-2月 -09
    张三                                  120 01-3月 -09SQL> SELECT * FROM test t WHERE t.money <> ALL (SELECT 1 FROM dual WHERE 1 = 2);NAME                                MONEY TIME
    ------------------------------ ---------- --------------
    张三                                  100 01-1月 -09
    李四                                   70 01-1月 -09
    张三                                  140 01-2月 -09
    张三                                  120 01-3月 -09SQL> 
      

  7.   

    SQL> SELECT * FROM test t WHERE t.money = ANY (SELECT 1 FROM dual WHERE 1 = 2);未选定行SQL> 
    SQL> SELECT * FROM test t WHERE t.money <> ANY (SELECT 1 FROM dual WHERE 1 = 2);未选定行SQL> 
      

  8.   

    结果我知道啊 只是想知道为什么是这个逻辑
    具体实现 可能是 All是循环去比较子查询的值 如果没找到不符合的 结果就是true 因为子查询是空的 所以找不到不符合的 所以是true  any的话就是循环去找符合条件的 如果找到1个就返回true 子查询是空的 自然找不到符合条件的 所以是falseany的逻辑是对的 但是all的逻辑总感觉是错的