相关架构:
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'));
但它正在返回一个空集。
有什么遗失吗?
答案 0 :(得分:0)
尝试将cid = all
替换为cid in
,它应该可以正常使用。
答案 1 :(得分:0)
ALL()
返回一组。但是当你使用'='
进行比较时,它会与元素进行比较。因此,元素无法与集合进行比较。如果您想知道该元素是否在集合中,那么您必须使用IN
子句而不是'='
答案 2 :(得分:0)
使用= ALL
毫无意义:单个courierservice.cid
同时如何等于多个city.cid
? ALL
仅与可以匹配多个值的比较运算符一起使用,例如>=
或<>
:请参阅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