【问题标题】:How to display only SINGLE minimum record from SQL database如何仅显示 SQL 数据库中的 SINGLE 最小记录
【发布时间】:2014-01-07 23:10:19
【问题描述】:

在为 Web 应用程序创建 SQL 语句时遇到了小问题。

我有一张带有 to_do_list(id、duration、text)的表格,我只想显示一条最小记录(其中 Duration = minimum),即使有多个记录。

我创造了这样的东西:

Select * from to_do_list where duration = (select min(duration) from to_do_list);

但它显示不止一条记录(我有几个相同持续时间的条目)。

我也试过这个:

Select id, min(duration), text from to_do_list;

但是在执行这个查询之后我收到了一个错误:

“列 'to_do_list.id' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我发现 LIMIT 应该可以解决我的问题,但是运行这个后我得到一个错误:

Select * from to_do_list where duration = (select min(duration) from to_do_list) LIMIT 1;

“'limit'附近的语法不正确。”

我使用的是 Microsoft SQL Express Server 2012。

我将不胜感激 U ppl 的任何帮助!

提前致谢。

【问题讨论】:

  • 错误是不言自明的,您缺少group by。如果不按其他东西分组,您就无法聚合。您可能不想要TOP 1,因为该值只是随机的。您需要澄清您正在寻找的结果。

标签: sql sql-server


【解决方案1】:

LIMIT 在 SQL Server 中不起作用,请改用TOP

SELECT TOP 1 * 
FROM to_do_list 
WHERE duration = (SELECT MIN(duration) 
                  FROM to_do_list);

您也可以为此使用ROW_NUMBER() 函数:

;WITH cte AS (SELECT *, ROW_NUMBER() OVER(ORDER BY duration) RN
              FROM to_do_list)
SELECT *
FROM cte
WHERE RN = 1

【讨论】:

    【解决方案2】:

    在我看来,这是:

    select top 1 *
    from to_do_list t
    order by t.duration
    

    优于

    select top 1 *
    from to_do_list t
    where t.duration = select min(duration) from to_do_list )
    

    虽然值得检查执行计划,看看哪个执行得更好。

    【讨论】:

    • 是的,应该是order by t.duration, other_expression 以一致地解决关系。
    • @Zane:您可能想阅读原始问题陈述:“我有一张桌子……我只想显示一条最小记录(其中 Duration = 最小值),即使有多个。”虽然 O.P.可能关心选择保持最短持续时间的特定行,但他只说他想要 a 单行。
    • @NicholasCarey 这并不意味着不值得指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多