不利用聚合函数MAX求最大值
这个问题是从书上看来的,觉得方法不错就部分摘抄下来了。
根据下面的SQL数据表:
T_Number ( num INT ) |
请写一条SQL语句,返回 num 的最大值,不能使用汇总功能(MAX、MIN等)。
先给出一个示例数据表以便更好的进行思考:

为了方便方便起见,我把建表的SQL语句也贴出来,这样您就可以您自己的SQL Server上快速地建立起同样的数据表。
CREATE TABLE T_Number ( num int ); INSERT INTO T_Number(num) VALUES (5); INSERT INTO T_Number(num) VALUES (23); INSERT INTO T_Number(num) VALUES (-6); INSERT INTO T_Number(num) VALUES (7); |
在这些示例数据中,您需要打印出23。其他数据都小于23。这虽然不错,但无助于想出SQL语句。换一种类似的说法,23是唯一一个没有比它自己大的数,这种说法更有用。如果您能返回没有别的值比它大的数,那就只返回23,这样问题就解决了。这句话比较拗口,我们可以这样说,先得到比23小的数值,然后再返回没在这堆数值里出现过的数,显然,这个数就是23。
首先,您需要弄清楚哪些数比它小。这个查询比较好办。先让这个表自关联,创建所有可能的数值对,其中一列数值比另一列的小,这个查询如下:
SELECT Lesser.num,Greater.num FROM T_Number AS Lesser, T_Number AS Greater WHERE Lesser.num < Greater.num; |
利用示例数据,将得到下表结果:

正如我们所期望的,所有比23小的值都在Lesser字段中。因此,如果您将前面的查询作为一个子查询,然后选择不再其中的值,就可以得到最大值。这个查询如下:
SELECT num FROM T_Number WHERE num NOT IN ( SELECT Lesser.num FROM T_Number AS Lesser, T_Number AS Greater WHERE Lesser.num < Greater.num); |
这个查询有一个小缺陷。如果最大值在T_Number表中是重复的,它将返回两次以上。要防止这一点,就要使用DISTINCT关键之。这项改动是的查询变为:
SELECT DISTINCT num FROM T_Number WHERE num NOT IN ( SELECT Lesser.num FROM T_Number AS Lesser, T_Number AS Greater WHERE Lesser.num < Greater.num); |
最后就得到了我们想要的结果:

分类:
SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?