【问题标题】:Simple question on database query关于数据库查询的简单问题
【发布时间】:2010-04-06 05:31:54
【问题描述】:

在一次采访中,我被要求编写一个 SQL 查询,该查询从表中的某个列中获取前三个具有最高值的记录。我编写了一个查询,它获取了所有具有最高值的记录,但我不知道我如何才能只获取前三个记录。

你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: java sql database


    【解决方案1】:

    SELECT TOP 3 * FROM Table ORDER BY FieldName DESC

    来自here,但可能有点过时了:

    Postgresql:

    SELECT * FROM Table ORDER BY FieldName DESC LIMIT 3
    

    MS SQL 服务器:

    SELECT TOP 3 * FROM Table ORDER BY FieldName DESC
    

    mySQL:

    SELECT * FROM Table ORDER BY FieldName DESC LIMIT 3
    

    【讨论】:

    • 这对 Oracle 来说是不正确的。它在 ORDER BY 之前应用 WHERE,因此您可以获得任何匹配的 10 行,然后对它们进行排序。
    • @WW - 将删除 Oracle 例如然后。我对它的理解不够复杂,无法完全回答。最初来自答案中发布的链接。
    • 在 Oracle 中 SELECT R.* FROM (SELECT * FROM SomeTable ORDER by FieldName DESC)R WHERE rownum < 4 将为您解决问题。当然,还有一个方法涉及LEAD, LAGOracle Analytical 函数,这里就不赘述了。
    【解决方案2】:

    选择前 3 名....

    【讨论】:

      【解决方案3】:

      取决于数据库引擎,或者

      select top 3 * from table order by column desc

      select * from table order by column desc limit 3

      【讨论】:

        【解决方案4】:

        TOP 3 的语法因数据库而异。

        很遗憾,您需要使用这些结构才能获得最佳性能。 像 Hibernate 这样的库在这里可以提供帮助,因为它们可以将通用 API 转换为各种 SQL 方言。

        由于您询问的是 Java,因此可以只从数据库中选择所有内容(使用 ORDER BY),但只获取前三行。根据查询需要如何执行,这可能已经足够好了(特别是如果由于适当的索引而不必对数据库进行排序,例如当您按主键字段排序时)。

        但一般来说,您希望使用 SQL 解决方案。

        【讨论】:

          【解决方案5】:

          在 oracle 中你也可以使用 where rownum

          在 mysql 上还有一个 Limit 关键字(我认为)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            • 2021-08-05
            • 1970-01-01
            • 2017-08-16
            • 1970-01-01
            • 1970-01-01
            • 2021-09-26
            相关资源
            最近更新 更多