0

関連するスキーマ:

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'));

でもこれはちょっと重そうです。

ドキュメントによると、次の All サブクエリで動作するはずです。

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

しかし、空のセットを返しています。

何か足りないものはありますか?

4

3 に答える 3

0

ALL()セットを返します。しかし、それを使用し'='て比較すると、要素と比較されます。したがって、要素をセットと比較することはできません。その要素がセット内にあるかどうかを知りたい場合は、IN代わりに句を使用する必要があります'='

于 2012-10-14T07:42:28.843 に答える
0

を使用するのは無意味です: 1 つの が同時に複数の と等しくなるに= ALLはどうすればよいでしょうか? は、 orなど、複数の値に一致する比較演算子と一緒にのみ使用さます。courierservice.cid city.cidALL>=<>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
于 2012-10-14T08:08:30.890 に答える
0

cid = allasを置き換えてみるcid inと、うまくいくはずです。

于 2012-10-14T07:35:26.303 に答える