Here我问了一个关于不工作查询的问题。
无意中(在一个答案的帮助下)我找到了如何使解决方案正确。问题是我不明白为什么会产生不同的结果。
因此,数据库具有以下模式:
我正在使用最高价格从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) 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.
所以我不知道他们用什么引擎来评估这个练习。
答案 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
,这不是真的。