value> = all(select v2 ...)从value =产生不同的结果=(select max(v2)...)

时间:2013-06-10 16:12:39

标签: sql

Here我问了一个关于不工作查询的问题。

无意中(在一个答案的帮助下)我找到了如何使解决方案正确。问题是我不明白为什么会产生不同的结果。

因此,数据库具有以下模式:

enter image description here

我正在使用最高价格从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) 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 个答案:

答案 0 :(得分: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返回标量值。如果不存在任何行,MAX将返回NULL。第{1行}中的1 >= NULL不正确。另一方面,1 >= all f是真的,因为条件不f s >是的。

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

与所有聚合函数一样,

MAX忽略NULL s。第3行的MAX(f)为0,1 >= 0为真。 ALL不会:它在第4行评估1 >= NULL AND 1 >= 0,这不是真的。