sql:尝试选择第二大元素但选择最大元素

时间:2010-04-08 14:10:57

标签: sql

我们希望拥有第二大元素。我们首先使用ANY来排除最大的一个。然后我们用all来选择最大的。但是,当我们运行此查询时,它会显示最大而不是第二个查询。为什么呢?

SELECT * 
FROM bestelling
WHERE totaalprijs > ALL
(
    SELECT totaalprijs
    FROM bestelling
    WHERE totaalprijs < ANY
    (
        SELECT totaalprijs
        FROM bestelling

    )
)
表中的

元素:

157.00
5.00
82.80
15.00
20.00
20.00

6 个答案:

答案 0 :(得分:5)

怎么样

select * 
from bestselling 
where totaalprijs < (select max(totaalprijs) from bestselling)
order by totaalprijs desc
limit 1;

答案 1 :(得分:5)

问题是“&gt;”在你最外面的查询中。如果你用语言打破这个,从内到外,你说:

  • 从表格中的所有行...
  • 告诉我totaalprijs小于其他值的所有值(即除了表中最大值的记录以外的所有记录,157.00)...
  • 然后,给我任何大于上一张表中所有记录的值。当然,这只是最大的一个。

如果您只想要第二大值,可以用MAX语句替换该外部子句:

SELECT max(totaalprijs)
FROM 
(
    SELECT totaalprijs
    FROM bestelling
    WHERE totaalprijs < ANY
    (
        SELECT totaalprijs
        FROM bestelling
    )
) M

或者,如果您想要所有带有“第二大”值的记录,您可以使用:

SELECT * FROM bestelling 
WHERE totaalprijs = 
(
    SELECT max(totaalprijs)
    FROM bestelling
    WHERE totaalprijs < ANY
    (
        SELECT totaalprijs
        FROM bestelling
    )
)

答案 2 :(得分:1)

如果您使用的是MSSQL,这也是一个很好的解决方案,您可以更明显地选择符合条件的第一条记录。

select Top 1 
from bestselling 
where totaalprijs < (select max (totaalprijs) from bestselling)
order by totaalprijs desc

使用

select * 
from bestselling 
where totaalprijs < (select max (totaalprijs) from bestselling)
order by totaalprijs desc
limit 1;

适用于mySQL。

答案 3 :(得分:1)

最内层查询:列出所有值

中间查询:列出所有值,其中每个值至少存在一个大于它的值

外部查询:列出这些值大于中间查询中任何值的所有值

因此,中间查询获取除最大值之外的所有内容,并且外部查询列出除了最大值之外的所有内容 - 这将是最大值。

以下调整后的查询应该这样做,但如果有两行或多行都包含第二大值,则必须考虑如何处理。

SELECT *  
FROM bestelling 
WHERE totaalprijs =
 ( 
    SELECT max(totaalprijs)
    FROM bestelling 
    WHERE totaalprijs < ANY 
    ( 
        SELECT totaalprijs 
        FROM bestelling 

    ) 
) 

答案 4 :(得分:0)

好的,那么对于Oracle如何:

select * 
from bestselling 
where totaalprijs < (select max(totaalprijs) from bestselling)
and rownum < 2
order by totaalprijs desc;

答案 5 :(得分:0)

此解决方案仅使用ALL和ANY来获得结果。

这部分排除了最大值。

SELECT totaalprijs
FROM bestelling
WHERE totaalprijs < ANY
(
    SELECT totaalprijs
    FROM bestelling

)

所以,现在我们有一个结果集,其中最大值实际上是第二大。现在,我们必须从结果集中排除所有较小的元素。因此,我们必须从第一个结果集中选择,而不是从bestelling中选择。

SELECT * 
FROM
(
    SELECT totaalprijs
    FROM bestelling
    WHERE totaalprijs < ANY
    (
        SELECT totaalprijs
        FROM bestelling

    )
)
WHERE totaalprijs >= ALL
(
    SELECT totaalprijs
    FROM bestelling
    WHERE totaalprijs < ANY
    (
        SELECT totaalprijs
        FROM bestelling
    )
 )