一尘不染

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

sql

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

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

在此处输入图片说明

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


阅读 147

收藏
2021-05-23

共1个答案

一尘不染

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行求值,这是不正确的。

2021-05-23