2016-08-15 18 views
2

servicesextraFeesという2つのテーブルがあり、関連する1xnからservices.id = extraFees.serviceIdという2つのテーブルがあります。私の問題は、s.ids.categoryの存在しない組み合わせに対して次のクエリを実行すると、すべてのフィールドがNULLのままで、まだ1 row(s) returnedになります。MIN()が0行の代わりに全NULL行を返すようにする

SELECT 100 + (s.feeRate * MIN(ef.extra)) AS extraFees FROM services s 
LEFT JOIN extraFees ef ON s.id=ef.serviceId WHERE s.id=12 AND s.category='PRG' 

私は番号またはNULLに置き換えるならば、私は0 row(s) returnedを取得するので、私は私が欲しいものである、犯人がMIN()である知っています。

SELECT 100 + (s.feeRate * 5) AS extraFees FROM services s 
LEFT JOIN extraFees ef ON s.id=ef.serviceId WHERE s.id=12 AND s.category='PRG' 
SELECT 100 + (s.feeRate * NULL) AS extraFees FROM services s 
LEFT JOIN extraFees ef ON s.id=ef.serviceId WHERE s.id=12 AND s.category='PRG' 

なぜこのようなことが起こりますか?どのように回避できますか?

答えて

4

集計関数は結果を返します。これを試してください:

CREATE TABLE x(id int); 
SELECT MIN(id) FROM x 

あなたは1行:NULLを取得します。

SELECT y.id 
    FROM (SELECT MIN(id) AS id FROM x) y 
    WHERE y.id IS NOT NULL 

またはHAVING句を利用します。あなたは にしたい場合は、NULLの結果を無視するサブクエリでラップすることができます。

4

これは、MIN() returns NULL if there were no matching rowsが原因で発生します。

どうすればよいですか?

NULLをフィルタリングするサブクエリでMIN()呼び出しをラップするようにしてください。

EDIT:

私はそのドキュメントを読んだが、私はMIN()で返されるNULLは、私は手動で私の最後のクエリで指定したNULLと異なる がどのように表示されません。

これは、第2のクエリセットが集計クエリではないためです。 集約クエリは、行の集計結果を返します。 行がない場合、クエリはNULLを返します。

一方、2番目のクエリセットは集約クエリではなく、論理的な結果として「空のセット」を返すことができます。

+0

私はそのドキュメントを読んだことがありますが、MIN()が返すNULLが、最後のクエリで手動で指定したNULLとどのように違うのか分かりません。 – user3748908

+0

@ user3748908「NULL」を使用するだけで集計計算がトリガーされないため、すべてのフィルタ処理が基本表に対して行われた後に、表示する行はありません。 'MIN'を使うと、常に行を返す集約演算が強制されます。フィルタリングが行われた後(行が返されない)、集計計算は空の結果セットに対して行われ、その結果、「NULL」値を持つ1つの行が生成されます。 – Glenn

関連する問題