2016-06-21 17 views
2

私はペットのサイズを表すpet_sizeというテーブルを手に入れました! サイズとすることができる:sqlがサブクエリに存在しない場合でも値を返す方法は?

id name 
1 small 
2 medium 
3 large 

はまた、提供未知かを表す0が、それをテーブルに追加されません。

は、その後、私はこのクエリを得た:

SELECT pet_breed.id, pet_breed.breed_name, pet_type.type_name, pet_size.size_name 
FROM pet_breed, 
    pet_type, 
    pet_size 
WHERE pet_breed.petTypeId = pet_type.id 
    AND pet_breed.sizeId = pet_size.id 
ORDER BY pet_breed.id 

上記作品完全pet_breed.sizeIdに0を得た者を除くこれらの任意のレコードのために、それは最もエレガントな何、pet_size.idに存在しないため、それを修正する方法は、pet_sizeテーブルにダミーの値を追加するほかに?

sizeIdが0の場合は、size_nameに "unknown"を使用します。

最後に、上記のクエリを最適化することができますか?あなたは古いスタイルを使用している

+1

タグはdbmsのみ使用されます。 MySQLまたはMS SQL Serverを使用していますか? – jarlh

+0

ベストオプションは、最も単純なものですが、ペットサイズテーブルに '0、 'unknown'という値を持つレコードを追加することです。 –

+0

ステップ1)現代的で明示的な 'join'構文に切り替えます。ステップ2)左結合に変換します。 – jarlh

答えて

3

は、更新が正しいLEFT JOINを使用するために、あなたはより多くのあなたのコードを行いますあなたは、私は表の別名でこれを更新しました

SELECT 
pb.id 
,pb.breed_name 
,pt.type_name 
,IFNULL(ps.size_name,'Unknown') size_name 
FROM pet_breed pb 
LEFT JOIN pet_type pt 
    ON pb.petTypeId = pt.id 
LEFT JOIN pet_size ps 
    ON pb.sizeId = ps.id 
ORDER BY pb.id 

を期待している結果を得るでしょう、参加しますまた読める。

古いジョインはINNER JOINSとして動作し、すべてのテーブルで値が一致する行のみを返します。

編集:質問をもう一度読んで、ISNULLを入力して、データが一致しない場所をキャッチします。

Edit2:ISNULLではなくIFNULL

+0

ありがとう、ちょうどヘッドアップ私はmysqlのためにISNULLをIFNULLに変更しなければならなかった。 –

+0

いいです。タグでその時点でどのシステムを使用していたのかわかりませんでした。 –

関連する問題