2012-02-15 6 views
0

'status'というフィールドに関連する2つのテーブルがあります。 table2.locationの値が 'texas'の場合​​、table2.statusのインスタンスは20個あり、値は 'good'です。SQL LEFT JOINとどこが予期しない結果をもたらす

つまり、次のクエリはtable2.status = 'good'の20行を返します。

[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas'; 

さらに、table1.status = 'good'を持つ50個のunique table1.idがあります。

つまり、次のクエリは50個の一意のtable1.idを返します。今

[B] SELECT table1.id FROM table1 WHERE table1.status = 'good'; 

、私は次のクエリを実行すると:

[C] SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.status = table2.status WHERE table2.location = "texas"; 

私はそれはユニークなIDの50行を返すことを期待します。しかし、実際には、一意のIDの20回の50行を返しています(つまり、1000行が返されます)。

私がしたクイックフィックスは、単純にSELECT DISTINCT table1.id ...を実行して、50行(50行のうち20セットではない)の1セットを返します。

しかし、なぜ私はこの行動を見ているのですか?私の質問[C]には何か問題がありますか?

ありがとうございます!

答えて

1

はあなたのクエリには、二つの問題

SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.status = table2.status 
WHERE table2.location = "texas"; 

ファーストを持っています2番目のテーブルの条件をwhere句ではなくON句に入れる必要があります。または、左ジョインを内部ジョインに変換する必要があります(条件を満たさなければならないため)。

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
    ON table1.status = table2.status 
    AND table2.location = "texas"; 

次の問題は、あなたが実際に参加したいと思う状況ではないということです。あなたが望む結果を得るためには、2つのテーブルのテーブル構造を見る必要があります。

2

50個のアイテムを取得したい場合はクエリが間違っています:50x20のクロス結合を実行しているため、結果として1000個のレコードがあります。
ステータスに参加することはできません(これは一意ではありません):あなたのテーブルのデザインが間違っている可能性があります。
IMOあなたは両方のテーブルにIDを持っていて、それに参加する必要があります...

2

それは期待されます。あなたは左をusaeとき表2から表1のマッチテーブルからテーブル2、2行目から50行1試合、再び同じ50行から1行目など

関連する問題