2017-05-13 12 views
0

すべてのドライバーは、それらの間を移動する都市のリストを持っています(テーブル "mycities")。開始都市とターゲット都市が私の都市リストにあるジョブを選択するSqlクエリ

開始都市とターゲット都市がリストにあるジョブリスト(JOBSテーブルから)を表示したいと思います。私は街を開始し、同時に都市をターゲットの両方をチェックするためにテーブルを結合する方法が混乱しています:

私はOR演算子を使用した場合、結果は両都市をカバーしていないと私はAND演算子を使用している場合、結果は希望空である:

答えて

1

あなたは、対象都市に対して開始都市のために1回、都市テーブルに2回参加します。それらを区別するためにテーブルのエイリアスを使用してください。

select * 
from jobs 
inner join mycities start on start.city = jobs.startcity 
inner join mycities target on target.city = jobs.targetcity; 

そして、あなたは街のテーブルから任意のデータを選択したくない場合には、あなたがすべてで参加し、代わりにINまたはEXISTSを使用していないだろう。

select * 
from jobs 
where startcity in (select city from mycities) 
and targetcity in (select city from mycities); 
+0

を。あなたは大量のデータが速いことを知っていますか? –

+1

いいえ、とにかく、パフォーマンスの問題がない限り、私はいつも簡単なクエリを使用します。したがって、市のテーブルからのデータが必要ない場合は、参加しないでくださいが、 'IN 'だけを参照してください。弱いオプティマイザを持つデータベースの中には、 '存在しているものはどこに存在するのですか(選択したものから+ mycities.city = jobs.startcityから選択するもの)'というものがあります。 'IN'が遅すぎるときやあなたが好きなときには' EXISTS'を使います。パフォーマンスの問題がある場合にのみ、結合を使用します。 –

1
(mycities.city=jobs.startcity or mycities.city=jobs.targetcity) 

この出発都市がまたは targetcityがテーブル "mycities"にあることを意味します。

(mycities.city=jobs.startcity and mycities.city=jobs.targetcity) 

あなたがこれだけの仕事、startcity = targetcityを取得し、結果が理由ですので、これは...

a=b and a=c mean also b=c 

を "mycities" startcity targetcityがテーブルにあることを意味するが、

空の。

あなたは、おそらくのようなものを使用したい:ありがとう

SELECT * FROM jobs WHERE 
    startcity IN (SELECT * FROM mycities) AND 
    targetcity IN (SELECT * FROM mycities);