Sql 按键获取最小/最大值-不同的方法
我有一个包含两列的表,即ID和KEY(这里的KEY是一个整数),如 任务:获取最大密钥的ID 解决方案1:Sql 按键获取最小/最大值-不同的方法,sql,sql-server,sql-order-by,Sql,Sql Server,Sql Order By,我有一个包含两列的表,即ID和KEY(这里的KEY是一个整数),如 任务:获取最大密钥的ID 解决方案1: Select Top(1) ID from TABLE order by KEY desc 解决方案2: 编辑:查询无效。这就是我的意思: Select ID from TABLE where KEY = (select max(KEY) from TABLE) 这些解决方案中有一个绝对优于另一个吗?每种解决方案的优点/缺点是什么 编辑: 假设没有索引。 案例1-大桌子 案例2-
Select Top(1) ID
from TABLE
order by KEY desc
解决方案2:
编辑:查询无效。这就是我的意思:
Select ID
from TABLE
where KEY = (select max(KEY) from TABLE)
这些解决方案中有一个绝对优于另一个吗?每种解决方案的优点/缺点是什么
编辑:
假设没有索引。
案例1-大桌子
案例2-小桌子
背景:
我正在进行代码审查,我在不同的上下文中多次发现了这两种解决方案—有时有索引,有时没有索引,有时用于大型表,有时用于小型表。聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中 解决方案1将是最好的。where子句中的子查询将不太理想。
在性能方面有很多设计技巧需要考虑,我不打算在回答这个问题时详细介绍。我昨天发现了这篇文章,它给了我更多的视角,在解决方案1中,order by子句将对查询结果进行排序。 查询执行顺序: 从句对从句外部从句WHERE从句分组按从句有从句选择从句不同从句顺序按从句顶部从句 您可以使用以下查询:
Select ID,
RANK() OVER (ORDER BY KEY DESC) AS KeyRank
from table1
HAVING keyRank = 1
解决方案1将起作用,但解决方案2将抛出异常,如下面所示 Msg 147,第15级,第1状态,第22行-聚合可能不会出现在 WHERE子句,除非它位于HAVING子句中包含的子查询中 或选择列表,并且要聚合的列是外部 参考资料
您可以使用查询1 您不能使用查询2,因为您不能像这样使用聚合函数。如果您想在查询中使用where子句和聚合函数,您必须按照以下步骤操作:
Select id from table where key in (select max(key) from test);
仅使用聚合函数和having子句引用
这两个查询是不同的(编辑后修复了第二个查询) 第一个必须返回一行 第二个返回所有匹配的行 即使
key
为空,第一个函数也会返回一行
第二种情况并非如此
您应该使用您想要的逻辑。表中有多少条记录?你们在ID列上有索引吗?第二个查询有效吗?没有。我将编辑question@Nikolas里德尔:我已经纠正了你的新问题。我还将原始查询放回了请求中,因为否则您已经得到的答案会令人困惑。您可能希望告知回答者您的编辑,以便他们调整答案。
Select ID,
RANK() OVER (ORDER BY KEY DESC) AS KeyRank
from table1
HAVING keyRank = 1
Select id from table where key in (select max(key) from test);
Select ID ,max(key)
from test
group by ID,key
having (key) >= 12
order by 1