Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按键获取最小/最大值-不同的方法_Sql_Sql Server_Sql Order By - Fatal编程技术网

Sql 按键获取最小/最大值-不同的方法

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-

我有一个包含两列的表,即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-小桌子

背景:
我正在进行代码审查,我在不同的上下文中多次发现了这两种解决方案—有时有索引,有时没有索引,有时用于大型表,有时用于小型表。

聚合可能不会出现在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