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