2

我想查找sids所有命令中评分最高的。

max通过写命令找到它

select S.sid,S.sname 
from Sailors S 
where S.rating = (select max(S1.rating) from Sailors S1)

但我也想通过使用all命令找到它,所以我写它

select S.sid,S.sname 
from Sailors S 
where  S.rating > all (select S.rating from Sailors S)

但它不会给出相同的结果。

我的错误是什么?我该如何规范它?

4

2 回答 2

6

您只需将查询修改为以下内容:

select S.sid,S.sname 
from Sailors S 
where  S.rating >= all (select S.rating from Sailors S)

虽然 Mahmoud 对于当前条件的问题部分是正确的,但添加相等的可能性会为您提供与MAX查询相同的行为,因为集合中的每个元素都必须大于或等于自身。(马哈茂德关于没有元素可以大于自身的观点是准确的。)

请参阅Mahmoud 提供的这个 SQLfiddle

正如 ypercube 在评论中指出的那样,如果列中的任何值为 NULL,则此方法不起作用。如果您修改子查询以指定WHERE rating IS NOT NULL, 或NOT NULL列,它应该仍然可以正常工作。

于 2012-11-11T09:17:26.173 回答
2

在 SQL-Server 中,您也可以简单地使用ORDER BY组合与TOP (1)规范WITH TIES

SELECT TOP (1) WITH TIES
    S.sid, S.sname 
FROM Sailors S 
ORDER BY S.rating DESC ;
于 2012-11-11T09:36:25.823 回答