MySQL子查询使用ALL

时间:2012-10-14 07:30:34

标签: mysql subquery

相关架构:

courier(courid:int,courname:str)
city(cid:int,cname:str,zid:int) #zid belonging to some table named zone
courierservice(courid:int,cid:int)

因此明显的关系是快递'服务'城市。我一直在努力让所有的快递员为“两个”城市服务,其中cname为A和B. 即可能的交叉点。

我可以使用以下方法获得解决方法:

 select courname from courier where courid in (select courid from courierservice
 where cid=(select cid from city where cname='A')) and
 courid in (select courid from courierservice where cid=(select cid from city where cname='B'));

但这看起来有点沉重。

根据文档,它应该使用以下所有子查询:

select * from courier where courid in (select courid from courierservice 
where cid = all (select cid from city where cname='A' or cname='B'));

但它正在返回一个空集。

有什么遗失吗?

3 个答案:

答案 0 :(得分:0)

尝试将cid = all替换为cid in,它应该可以正常使用。

答案 1 :(得分:0)

ALL()返回一组。但是当你使用'='进行比较时,它会与元素进行比较。因此,元素无法与集合进行比较。如果您想知道该元素是否在集合中,那么您必须使用IN子句而不是'='

答案 2 :(得分:0)

使用= ALL毫无意义:单个courierservice.cid 同时如何等于多个city.cidALL仅与可以匹配多个值的比较运算符一起使用,例如>=<>:请参阅Subqueries with ALL

但是,您最好使用JOIN重写查询(更简洁,更高效):

SELECT courname FROM courier NATURAL JOIN (
  SELECT   courid
  FROM     courierservice JOIN city USING (cid)
  WHERE    cname IN ('A', 'B')
  GROUP BY courid
  HAVING   SUM(cname='A') AND SUM(cname='B')
) t