繁体   English   中英

通过键获取最小值/最大值-不同的方法

[英]Get min/max value by key - different approaches

我有一个具有两列的表,即ID和KEY(此处的键为整数),例如

ID KEY
ABC 6
DEF 1
GHI 12

任务:获取MAX键的ID

解决方案1:

Select Top(1) ID
from TABLE
order by KEY desc

解决方案2:

 
 
 
 
  
  
  Select ID from TABLE where ID = MAX(ID)
 
 
  

编辑 :查询无效。 这就是我的意思:

Select ID
from TABLE 
where KEY = (select max(KEY) from TABLE)

这些解决方案中的一种绝对优于另一种吗? 每个解决方案的优点/缺点是什么?

编辑 :假设没有索引。 案例1-大桌子案例2-小桌子

背景:我正在进行代码审查,并且在不同的上下文中多次找到这两种解决方案-有时带有索引,有时没有索引,有时是大表,有时是小表。

除非聚合不在HAVING子句或选择列表中包含的子查询中,否则它可能不会出现在WHERE子句中。

解决方案1将是最好的。 where子句中的子查询将不是最佳选择。 确实有很多设计技术可以用来研究性能,我不会在这个答案中讨论。 我昨天发现这篇文章,这给了我更多的视角https://www.red-gate.com/simple-talk/sql/database-administration/sql-server-storage-internals-101/

在解决方案1中,order by子句只会对您的查询结果进行排序。 查询执行顺序:

FROM子句ON子句OUTER子句WHERE子句GROUP BY子句HAVING子句SELECT子句DISTINCT子句ORDER BY子句TOP子句

您可以使用以下查询:

Select ID,
RANK() OVER (ORDER BY KEY DESC) AS KeyRank
from table1
HAVING keyRank = 1

这两个查询是不同的(在修改了第二个查询之后,您进行了修改)。

第一个必须返回一行。

第二个返回所有匹配的行。

即使key为NULL,第一个也返回一行。

第二个没有。

您应该使用执行所需功能的逻辑。

解决方案1可以工作,但是解决方案2会像下面这样抛出异常

消息147,级别15,状态1,第22行聚合可能不会出现在WHERE子句中,除非它在包含在HAVING子句或选择列表中的子查询中,并且正在聚合的列是外部引用。

您可以查询1,

您不能使用查询2,因为您不能使用类似的聚合函数,如果您想在查询中使用where子句和聚合函数,则必须遵循以下条件:

Select id  from table where key in (select max(key) from test);

仅使用聚合函数和Haven子句引用

Select  ID ,max(key)
   from test
   group by ID,key
   having (key) >= 12
    order by 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM