问题描述
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 >= NULL
在第1行上,1 >= all
f
s不成立。另一方面,s是成立,因为根本没有f
条件 不 成立的s 。
第三次select
返回1
,第四次不select
返回任何内容。
MAX
像所有聚合函数一样,忽略NULL
。MAX(f)
在第3行上为0,并且1 >= 0
为true。ALL
否:它1 >= NULL AND
1 >= 0
在第4行求值,这是不正确的。
解决方法
偶然(在一个答案的帮助下),我找到了正确解决方案的方法。问题是我不明白为什么它们会产生不同的结果。
因此,数据库具有以下架构:
而我在寻找一切从模型PC
,Printer
并Laptop
与 最高
价格。所有这些表都可能具有非唯一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.
因此,我不知道他们确切地使用了哪个引擎来评估本练习。