6

在这里,我问了关于不工作查询的问题。

意外地(在一个答案的帮助下)我发现了如何正确解决问题。问题是我不明白为什么它们会产生不同的结果。

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

在此处输入图像描述

我正在寻找所有型号PCPrinter价格Laptop最高。所有这些表都可能具有非唯一列,因为具有不同的项目可能具有相同的模型。modelcode

我原来的解决方案是:

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. 所以我不知道他们究竟使用哪个引擎来评估这个练习。

4

1 回答 1

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返回NULL1 >= NULL在第 1 行不为真。另一方面,1 >= all fs 为真,因为根本没有f条件为真的 s。

第三个select返回1,第四个select什么也不返回。

MAX,像所有聚合函数一样,忽略NULLs。MAX(f)在第 3 行为 0,并且1 >= 0为真。ALL没有:它1 >= NULL AND 1 >= 0在第 4 行求值,这是不正确的。

于 2013-06-10T16:18:28.927 回答