2011-09-25 5 views
8

比較は、なぜ、このクエリはヌル

SELECT distinct u_id,timestamp as time 
FROM my_table; 

として行を返すん

SELECT distinct u_id,max(timestamp) as time 
FROM my_table; 

私のテーブルには全くの行を持っていない場合(または、私が追加した場合、どこ行が一致しない条項):

前者は空の結果セット(私が期待しているもの)を返す 後で両方のフィールドの値としてnullを持つ単一の行を返します。

誰かが私に説明してもらえますか?

答えて

16

MySQLのドキュメントは

MAX(言う)一致する行がない場合はNULLを返します。

データがない場合は、両方の値がNULLとして返されます。

あなたは2番目のクエリがあまりにも空の結果を返したい場合は、あなたは集約関数で使用できる句を有する例えばNULL値をフィルタリングする必要があります。

SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL; 
+2

これは技術的には半分に過ぎません。残りの半分は、集計関数を非集約関数と組み合わせて使用​​している間にgroup-by節が存在しないため、u_idがNULLです。 – tobyodavies

0

この質問へのこの実際の答え見出しのポイント:SQLは集計演算子をリレーショナル・モデルでサポートしておらず、単に要約の特殊なケースをサポートするだけではありません。さらに、SQLには1つのデータ構造しかないため、テーブルSQL集計演算子の呼び出し(疎結合)はテーブル式の一部として現れなければならず、なぜ2番目のテーブルが「ダミー」の単一行を返します。

詳細については、SQL and Relational Theory: How to Accurate SQL Code - C. J. Date (2009)のセクション7.5を参照してください。集合演算子。

関連する問題