2016-09-15 10 views
-1

carのデータとcarNameのデータを1行だけ得たい場合は、この車のmakerNameplateNumberの値があります。例えば、。いくつかのフィールドがnullの場合の結合での問題

Ford Taurusはプレートの番号を持っていない何らかの理由で、私はプレートの番号欄の値なしで、この1行を取得したい場合は、たとえば

Ford Taurus, Ford, null. 

のために、私は以下のsqlを試みたが、Iすべてmakerlicenseテーブルのすべての値を取得し、私はmakerlicense表にcar.idためwhere句に制約を追加する場合licenseの値がnullある場合、私は0行を取得。

これはどのようにすることができますか?あなたがleft joinを探しているよう

select 
    car.id as carID, 
    maker.carId as makerCarId, maker.name as makerName, 
    license.carId as licenseCarId, license.plateNumber as plateNumber 
from 
    car car, 
    maker maker, 
    license license 
    where car.id = 4951 
; 
+0

最新の明示的なJOIN構文に切り替えます。書き込みが容易(エラーなし)、読みやすく、必要に応じて外部結合に変換する方が簡単です。 – jarlh

+0

テーブルを結合する条件は次のとおりです。あなたはクロスプロダクトを得る – Jens

答えて

1

あなたは左のテーブルからすべての行を返すSQL LEFT JOINキーワード、(car)を使用する必要があり、私が試した何

右側のテーブル(makerまたはlicense)に一致する行が表示されます。一致するものがなければ右側にNULLの結果が出ます。

SELECT car.id AS carID 
    , maker.name AS makerName 
    , license.plateNumber AS plateNumber 
FROM car AS car 
LEFT JOIN maker AS maker ON car.id = maker.carId 
LEFT JOIN license AS license ON car.id = license.carId 
WHERE car.id = 4951 
0

は思え::

SELECT 
    car.id AS carID, 
    maker.carId AS makerCarId, maker.name AS makerName, 
    license.carId AS licenseCarId, license.plateNumber AS plateNumber 
FROM 
    car 
JOIN 
    maker ON car.id = maker.carId 
LEFT JOIN 
    license ON car.id = license.carId 
where car.id = 4951 
0

クエリの結果は、car、maker、およびlicenseテーブル間のデカルト結合です。 これにより、WHERE句にcar idを持つすべての行が提供されます。

期待どおりの結果を得るには、クエリで使用されるテーブル間のフィルタまたは結合条件を使用して結果セットを絞り込む必要があります。私はナンバープレートがなくても望ましい結果を得るための条件でOUTER JOINを追加しました

SELECT car.id AS carID , maker.name AS makerName , license.plateNumber AS plateNumber FROM car AS car JOIN maker AS maker ON car.id = maker.carId LEFT OUTER JOIN license AS license ON car.id = license.carId WHERE car.id = 4951;e

は、あなたの期待される結果については、以下のクエリを使用してください。 JOIN条件のみを使用しても、車のナンバープレート番号がない場合は、希望の結果がフェッチされません。

関連する問題