2013-06-10 7 views
6

Here質問をしていないと質問しました。value> = all(select v2 ...)は、value =(select max(v2)...)とは異なる結果を生成します。

偶然(1つの回答の助けを借りて)解決方法を正しく見つける方法を見つけました。問題はなぜ彼らが異なる結果を生むのか理解できないことです。

ので、データベースは、このスキーマを持っています

enter image description here

そして、私は最高価格でPCPrinterLaptopからすべてのモデルを探しています。 codeの項目には同じモデルが含まれている可能性があるため、これらの表はすべて一意ではないmodel列を持つ可能性があります。

私のオリジナルのソリューションでした:

with model_price(model,price) as (
select model,price 
from PC 

union 

select model,price 
from Laptop 

union 

select model,price 
from Printer 
) 

select model 
from model_price 
where price >= all(select price from model_price) 

は、それは間違った結果を与えた - システムが* Wrong number of records (less by 2)を返しました。

with model_price(model,price) as (
select model,price 
from PC 

union 

select model,price 
from Laptop 

union 

select model,price 
from Printer 
) 

select model 
from model_price 
where price = (select max(price) from model_price) 

は、なぜallとソリューションは異なる結果を生成します。作品

修正ソリューションは、このですか?

SQLエンジンについて

Now we use Microsoft SQL Server 2012 on the rating stages, and MySQL 5.5.11, PostgreSQL 9.0, and Oracle Database 11g on the learn stage in addition. だから私はまさに彼らがこの運動を評価するために使用したエンジンわかりません。

+1

データに「NULL」が含まれていますか? 'select 1 where 1> = ALL(ヌル共用体選択0を選択)'は行を返しません。 –

+0

申し訳ありませんが、第2のデータベースのデータはわかりません(これは、演習が不正行為をしないようにするためのものです)。私は2番目のDBのクエリの結果を見ることさえできません。 '*レコード数が間違っています(2つ少ない)。 – ovgolovin

答えて

5
create table t (f int null); 

select 1 where 1 >= (select max(f) from t); -- 1 
select 1 where 1 >= all(select f from t); -- 2 

insert into t values (null), (0); 

select 1 where 1 >= (select max(f) from t); -- 3 
select 1 where 1 >= all(select f from t); -- 4 

http://www.sqlfiddle.com/#!6/3d1b1/1

select戻り何も、第二select戻る1

MAXはスカラー値を返します。行が存在しない場合、MAXNULLを返します。 1 >= NULLは、1行目には当てはまりません。一方、1 >= all fは、ではないが真であるfがまったく存在しないため、真です。

第3のselect1を返し、第4のselectは何も返しません。

MAXは、すべての集計関数と同様に、NULLを無視します。 MAX(f)は3行目で0で、1 >= 0がtrueです。 ALLはそうではありません。これは、4行目の1 >= NULL AND 1 >= 0を評価しますが、これは真ではありません。

+0

別の理由で 'ALL'を使いたい場合は' ISNULL'(別名 'ISNULL(price、0)')を使うことができます。 – Guvante

+0

ありがとう!これはおそらく私がこの作業から学ぶべき練習です!したがって、比較中に「NULL」は自動的に「0」に昇格されません。 – ovgolovin

+0

そう、すべてのフィールド値が負である可能性がある場合、 'NULL'を' 0'として扱うことは非常に間違っているかもしれないので、データベースが自動的にそれをしないことはおそらく良いことです。あなたが特別な「割引」記事を持っているならば、これはフィールド「価格」でも意味をなさないでしょう。 – hvd

関連する問題