值> =全部选择v2'与值=选择maxv2'产生不同的结果

问题描述

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返回标量值。如果不存在任何行,则MAX返回NULL1 >= NULL在第1行上,1 >= all fs不成立。另一方面,s是成立,因为根本没有f条件 成立的s 。

第三次select返回1,第四次不select返回任何内容

MAX像所有聚合函数一样,忽略NULLMAX(f)在第3行上为0,并且1 >= 0为true。ALL否:它1 >= NULL AND 1 >= 0在第4行求值,这是不正确的。

解决方法

偶然(在一个答案的帮助下),我找到了正确解决方案的方法。问题是我不明白为什么它们会产生不同的结果。

因此,数据库具有以下架构:

在此处输入图片说明

而我在寻找一切从模型PCPrinterLaptop最高
价格。所有这些表都可能具有非唯一model列,因为不同的项目code可能具有相同的模型。

我最初的解决方案是:

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 
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. 因此,我不知道他们确切地使用了哪个引擎来评估本练习。