SELECT * FROM Customers
WHERE CustomerID = ANY (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')SELECT * FROM Customers 
WHERE CustomerID IN (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')如果说以上两句查询完全等同的话,那么请问ANY这个关键词存在的意义又是什么呢?

解决方案 »

  1.   

    这个问题在微软技术内幕T-SQL查询一书中有明确解释,楼主可以查看一下
      

  2.   

    这个研究得比较深,三言两语无法解释得清楚.第二句:CustomerID IN (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')
    表示CustomerID在查询的CustomerID范围之内的.第一句:CustomerID = ANY (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')
    表示CustomerID等于任何一个查询出来的CustomerID.所以在这种情况下,两句结果一致.
      

  3.   

    any和some是同义词,他们之间没有逻辑区别
    in的输入可以是自面值列表货返回单列的子查询,any/some和all仅支持用子查询作为输入
    如果你要用自面值列表作为这些谓词的输入,必须把该列值转化为子查询原文见T-SQL查询 P210
      

  4.   

    http://wenku.baidu.com/view/1fad410a79563c1ec5da7112.html
      

  5.   

    用some,any和all对子查询中返回的多行结果进行处理。下面我们来简单介一下这几个关键词的含义。 
    Some在此表示满足其中一个的意义,是用or串起来的比较从句。 
    Any也表示满足其中一个的意义,也是用or串起来的比较从句,区别是any一般用在非“=”的比较关系中,这也很好理解,英文中的否定句中使用any肯定句中使用sone,这一点是一样的。 
    All则表示满足其其中所有的查询结果的含义,使用and串起来的比较从句。 
    下面是一些例子 
    找出员工中,只要比部门号为10的员工中的任何一个员工的工资高的员工的姓名个工资。也就是说只要比部门号为10的员工中的那个工资最少的员工的工资高就满足条件。 select ename,sal 
    From emp 
    Where sal > any(select sal from emp where deptno = 10); 这里推荐用any,如果你非要用some也是没有任何问题的,结果是一样的,只是一般来讲some用在“=”的比较从句中。 
    select ename,sal 
    From emp 
    Where sal > some(select sal from emp where deptno = 10); 上面的用法完全OK的。 
    select ename,sal 
    From emp 
    Where sal = some(select sal from emp where deptno = 30) and deptno not in (select deptno from emp where deptno = 30); 上面才是some的正常用法。其含义是找到和30部门员工的任何一个人工资相同的那些员工。虽然没有找到。 
    最后一个关键字all的用法也很简单就是要与子查询的每一结果都要匹配。 select ename,sal 
    From emp 
    Where sal > all(select sal from emp where deptno = 20); 上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工 
    总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果集中“或”的比较关系,而all则是对子查询结果集总每一个结果“与”的关系 
      

  6.   

    = ANY 与 in 等价.
    可是 > ANY 就没有IN与其等价了.