【问题标题】:How do we get maximum value from table without using Max,Min or Order by Clause in SQL Server 2005?在 SQL Server 2005 中,我们如何在不使用 Max、Min 或 Order by Clause 的情况下从表中获取最大值?
【发布时间】:2011-01-22 16:44:32
【问题描述】:

我有一张表,其中 Salary 有 3 列,我想在不使用 Max、Min 或 order by 子句的情况下从该表中获取最大值。

数据

Salary 包含三个字段 - ID,Name,Amount 金额的值 - 100,70,80,400,300

我需要从这个数据中得到 400 的值。

我知道 Select max(Amount) from Salary,但我需要不带 max、min 或 Order by 子句。

提前致谢。

【问题讨论】:

  • 这一定是某种家庭作业,请这样标记。然后描述到目前为止你有什么想法来解决它。
  • 如果您找到不使用游标的解决方案,请告诉我。但是为什么要进行标签优化呢?
  • 如果您既不能使用 MIN/MAX 也不能使用 ORDER BY,则无法对数据进行任何排序,因此您将无法找到最小值和最大值(除了扫描通过所有行并以编程方式跟踪最小/最大值......)

标签: sql-server-2005


【解决方案1】:
选择 * 从工资 s1 WHERE s1.amount > ALL(选择 s2.amount 从工资 s2 哪里 s2.id s1.id);

但我怀疑它会比使用 max() 更快

【讨论】:

    【解决方案2】:

    鉴于这只是一个理论问题,NOT AT ALL 实用...这是我的答案。

    ALL 是一个很酷的 SQL Server 解决方案(参见下面的注释)。其余的,以及任何符合 ANSI 的 RDBMS

    SELECT *
    FROM salary s1
    WHERE not exists (SELECT *
                      FROM salary s2 
                      WHERE s2.id <> s1.id AND s2.Amount > s1.Amount);
    

    不过,这比 ALL 答案要好一些,因为如果有多个与 Max(salary) 的 TIES,它将显示所有 TIES,而如果在 MAX 有 TIES,Martin's 将不会返回任何结果。

    也可能运行得更快,因为not exists 退出每个 s1 行以在相关子查询中找到任何匹配项。

    【讨论】:

    • +1 我忘了领带。对于大量行,not exists 的效率低于all,但不是因为我认为您给出的原因。 (计划对两者都有反半连接)而是因为not exists 是三角形连接而all 几乎是交叉连接。针对我笔记本电脑上的 1,000,000 行数字表,我得到了 ALL(28181 毫秒,5272760 次读取)NOT EXISTS(1911 毫秒,3190772 次读取)@VARIABLE(499 毫秒,1614 次读取)MAX(0 毫秒,3读)
    • @Martin 它甚至小于三角形。只有当相关查询什么也没找到时,它才会是完全三角形的。一旦它可以使外部查询(Exist found)无效,它就可以立即退出该分支。这也是高密度子查询上的 Exists() 比后面的交叉连接 + 过滤要快得多的原因。
    【解决方案3】:
    declare @amount int
    
    SELECT @amount = CASE WHEN @amount > amount THEN @amount ELSE amount END 
    FROM yourtable
    
    
    select @amount
    

    这绝对不是优化,因为(假设amount 上的索引)MAX 可能会在第一个结果后停止扫描,而这必须扫描所有记录。

    不过还是比这更有效率

    SELECT *
    FROM salary s1
    WHERE NOT EXISTS(SELECT * FROM salary s2 WHERE s2.amount  > s1.amount)
    

    这又比ALL高效得多

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 2018-11-01
      • 2019-10-09
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多