6

ここで、クエリが機能しないことについて質問しました。

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

したがって、データベースには次のスキーマがあります。

ここに画像の説明を入力

そしてPC最高価格の のすべてのモデルを検索しています。これらのすべてのテーブルには、一意でない列が含まれる場合があります。これは、異なる項目が同じモデルを持つ可能性があるためです。PrinterLaptopmodelcode

私の元の解決策は次のとおりです。

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. この演習を評価するためにどのエンジンを正確に使用しているかはわかりません。

4

1 に答える 1

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

1 つ目selectは何も返さず、2 つ目は をselect返します1

MAXスカラー値を返します。行が存在しない場合は、 をMAX返しますNULL1 >= NULLは 1 行目で true ではありません。一方、1 >= all fs は trueです。fこれは、条件が true でない sまったくないためです。

3 番目は をselect返し1、4 番目selectは何も返しません。

MAXは、すべての集約関数と同様に、NULLs を無視します。MAX(f)は 3 行目で 0 であり、1 >= 0真です。ALLしません: 1 >= NULL AND 1 >= 04 行目で評価されますが、これは正しくありません。

于 2013-06-10T16:18:28.927 に答える