4

ロンドンなどの都市から直接飛べない都市を特定するクエリを作成しようとしています。与えられたスキーマ:

都市:

| c_id |   city_name    |   

フライト:

| f_id | departure_city_id | destination_city_id |

現在、私のクエリは反対を返します。つまり、ロンドンからの直行便がある都市を返します

SELECT c2.city_name as "City"
FROM flights AS f
JOIN cities AS c2 ON f.destination_city_id != c2.c_id
JOIN cities AS c ON c.c_id = c.c_id
WHERE c.city_name = 'London'
AND c.c_id != c2.c_id
AND f.departure_city_id = c.c_id;

私が望むものを得るためにそれを変更するのは簡単だと思っていたでしょう. 3行目を次のように変更することを考えました

JOIN cities AS c2 ON f.destination_city_id = c2.c_id

トリックを行ったはずですが、そうではありませんでした。何か助けはありますか?

4

2 に答える 2

1

都市私は都市から直接飛ぶことはできません、ロンドンと言います。

つまり、ロンドンから直接ではなく、そこに飛ぶことができます。だからJOIN(ではなくLEFT JOIN)経由cityする:flightdestination_city_id

SELECT DISTINCT c.city_name
FROM   cities c
JOIN   flights f ON f.destination_city_id = c.c_id
JOIN   cities c2 ON c2.c_id = f.departure_city_id
WHERE  c2.city_name <> 'London';

その後、ロンドン発のフライトを除外DISTINCTし、一意の都市名を取得するために申請するだけで完了です。

この質問のより洗練された解釈は、
「ロンドンから直接ではなく、飛ぶことができる都市」です。
しかし、これは基本的な宿題のように見えるので、彼らがあなたからの再帰クエリを期待するとは思いません。

于 2013-03-18T22:16:58.957 に答える
0

次のようなものを試してください:

SELECT * 
FROM cities c
WHERE c.c_id NOT IN
(SELECT f.destination_city_id
 FROM flights f
 JOIN cities c2 ON f.departure_city_id = c.c_id
 WHERE c2.city_name = 'London')
于 2013-03-18T21:02:17.117 に答える